From 807ef45666b6efa0f68009d044db82faff4692f5 Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Wed, 11 Aug 2010 10:51:27 +0000 Subject: [PATCH] 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 --- sys/amd64/amd64/mp_machdep.c | 10 +++++++++- sys/i386/i386/mp_machdep.c | 8 +++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c index 57daf74b5be..46ad2899ee3 100644 --- a/sys/amd64/amd64/mp_machdep.c +++ b/sys/amd64/amd64/mp_machdep.c @@ -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; diff --git a/sys/i386/i386/mp_machdep.c b/sys/i386/i386/mp_machdep.c index 2302d2121a3..a162dbb80c7 100644 --- a/sys/i386/i386/mp_machdep.c +++ b/sys/i386/i386/mp_machdep.c @@ -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;