mirror of
https://github.com/opnsense/src.git
synced 2026-06-08 16:22:46 -04:00
IPI handlers may run generally with interrupts disabled because they
are served via an interrupt gate. However, that doesn't explicitly prevent preemption and thread migration thus scheduler pinning may be necessary in some handlers. Fix that. Tested by: gianni MFC after: 1 month
This commit is contained in:
parent
ee1cd8fe2a
commit
807ef45666
2 changed files with 16 additions and 2 deletions
|
|
@ -1324,8 +1324,10 @@ cpustop_handler(void)
|
|||
cpumask_t cpumask;
|
||||
u_int cpu;
|
||||
|
||||
sched_pin();
|
||||
cpu = PCPU_GET(cpuid);
|
||||
cpumask = PCPU_GET(cpumask);
|
||||
sched_unpin();
|
||||
|
||||
savectx(&stoppcbs[cpu]);
|
||||
|
||||
|
|
@ -1356,8 +1358,10 @@ cpususpend_handler(void)
|
|||
register_t cr3, rf;
|
||||
u_int cpu;
|
||||
|
||||
sched_pin();
|
||||
cpu = PCPU_GET(cpuid);
|
||||
cpumask = PCPU_GET(cpumask);
|
||||
sched_unpin();
|
||||
|
||||
rf = intr_disable();
|
||||
cr3 = rcr3();
|
||||
|
|
@ -1535,10 +1539,14 @@ mp_grab_cpu_hlt(void)
|
|||
#endif
|
||||
int retval;
|
||||
|
||||
mask = PCPU_GET(cpumask);
|
||||
#ifdef MP_WATCHDOG
|
||||
sched_pin();
|
||||
mask = PCPU_GET(cpumask);
|
||||
cpuid = PCPU_GET(cpuid);
|
||||
sched_unpin();
|
||||
ap_watchdog(cpuid);
|
||||
#else
|
||||
mask = PCPU_GET(cpumask);
|
||||
#endif
|
||||
|
||||
retval = mask & hlt_cpus_mask;
|
||||
|
|
|
|||
|
|
@ -1411,8 +1411,10 @@ cpustop_handler(void)
|
|||
cpumask_t cpumask;
|
||||
u_int cpu;
|
||||
|
||||
sched_pin();
|
||||
cpu = PCPU_GET(cpuid);
|
||||
cpumask = PCPU_GET(cpumask);
|
||||
sched_unpin();
|
||||
|
||||
savectx(&stoppcbs[cpu]);
|
||||
|
||||
|
|
@ -1586,10 +1588,14 @@ mp_grab_cpu_hlt(void)
|
|||
#endif
|
||||
int retval;
|
||||
|
||||
mask = PCPU_GET(cpumask);
|
||||
#ifdef MP_WATCHDOG
|
||||
sched_pin();
|
||||
mask = PCPU_GET(cpumask);
|
||||
cpuid = PCPU_GET(cpuid);
|
||||
sched_unpin();
|
||||
ap_watchdog(cpuid);
|
||||
#else
|
||||
mask = PCPU_GET(cpumask);
|
||||
#endif
|
||||
|
||||
retval = mask & hlt_cpus_mask;
|
||||
|
|
|
|||
Loading…
Reference in a new issue