]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
x86: Restore the critical section around whole ipi_bitmap_handler() if
authorkib <kib@FreeBSD.org>
Sat, 7 Dec 2019 00:28:08 +0000 (00:28 +0000)
committerkib <kib@FreeBSD.org>
Sat, 7 Dec 2019 00:28:08 +0000 (00:28 +0000)
commit8fca58390a33179ce8e53fdf00fc223f553ddcd3
treeabf826f1fbb6dcc19d28ba463576d7b9cd4ed940
parenta51c00ce2017324b2ed522c55329aab196a7aafc
x86: Restore the critical section around whole ipi_bitmap_handler() if
hardclock IPI is delivered.

In the current code after r355311, critical section is taken only
around hardclockintr() call, and sched_preempt() is called after the
section is exited. If we reschedule after exit, as we typically would
due to conditions that caused IPI, in ULE the runq tdq_ipipending is
not cleared, which blocks generation of further preempt IPIs.

Since all relatively modern (10 years) hardware has per-cpu event
timers, restoring the critical section conditionally does not affect
it.

Reported and tested by: cy
Diagnosed and reviewed by: jeff (previous version)
Sponsored by: The FreeBSD Foundation
Differential revision: https://reviews.freebsd.org/D22716
sys/x86/x86/mp_x86.c