[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH][BUG#228] fix race with smp_resume()



* Ryan Harper <ryanh@xxxxxxxxxx> [2005-09-27 09:19]:
> This changeset breaks vcpu-hotplug for dom0. 
> 
> changeset:   6464:b3785cbb723b8b355c1282232de0bd1cfbfb3556
> user:        cl349@xxxxxxxxxxxxxxxxxxxx
> date:        Mon Aug 29 12:40:47 2005
> summary:     Simplify and fix SMP irq and ipi teardown/setup on 
> suspend/resume.
> 
> Specifically, calling vcpu-enable on DOM0 vcpu that has been disabled
> hangs DOM0:

This patch fixes a race between when the disable cpu is marked online
and binding IPIs back to the CPU.  In some cases, an IPI would be sent
to CPU1 before it had allocated a new evtchn.  Moving smp_resume() call
before setting the cpu online fixes this race.  This fixes [1]bug#228

Please apply.

1. http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=228

-- 
Ryan Harper
Software Engineer; Linux Technology Center
IBM Corp., Austin, Tx
(512) 838-9253   T/L: 678-9253
ryanh@xxxxxxxxxx


diffstat output:
 process.c |   18 +++++++++++-------
 1 files changed, 11 insertions(+), 7 deletions(-)

Signed-off-by: Ryan Harper <ryanh@xxxxxxxxxx>
---
diff -r ce54669c70fc linux-2.6-xen-sparse/arch/xen/i386/kernel/process.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/process.c       Wed Sep 28 
15:15:20 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/process.c       Wed Sep 28 
11:25:51 2005
@@ -112,6 +112,10 @@
 
 #ifdef CONFIG_HOTPLUG_CPU
 #include <asm/nmi.h>
+#ifdef CONFIG_SMP
+extern void smp_suspend(void);
+extern void smp_resume(void);
+#endif
 /* We don't actually take CPU down, just spin without interrupts. */
 static inline void play_dead(void)
 {
@@ -120,6 +124,13 @@
                HYPERVISOR_yield();
 
        __flush_tlb_all();
+   /* 
+    * Restore IPI/IRQ mappings before marking online to prevent 
+    * race between pending interrupts and restoration of handler. 
+    */
+#ifdef CONFIG_SMP
+       smp_resume();
+#endif
        cpu_set(smp_processor_id(), cpu_online_map);
 }
 #else
@@ -135,10 +146,6 @@
  * low exit latency (ie sit in a loop waiting for
  * somebody to say that they'd like to reschedule)
  */
-#ifdef CONFIG_SMP
-extern void smp_suspend(void);
-extern void smp_resume(void);
-#endif
 void cpu_idle (void)
 {
        int cpu = _smp_processor_id();
@@ -166,9 +173,6 @@
                                HYPERVISOR_vcpu_down(cpu);
 #endif
                                play_dead();
-#ifdef CONFIG_SMP
-                               smp_resume();
-#endif
                                local_irq_enable();
                        }
 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.