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:
Attilio Rao 2010-08-11 10:51:27 +00:00
parent ee1cd8fe2a
commit 807ef45666
2 changed files with 16 additions and 2 deletions

View file

@ -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;

View file

@ -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;