* Ryan Harper <ryanh@us.ibm.com> [2005-09-27
09:19]:> This changeset breaks vcpu-hotplug for dom0.
>
> changeset: 6464:b3785cbb723b8b355c1282232de0bd1cfbfb3556
> user: cl349@firebug.cl.cam.ac.uk
> 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@us.ibm.com
diffstat output:
process.c | 18 +++++++++++-------
1 files changed, 11 insertions(+), 7 deletions(-)
Signed-off-by: Ryan Harper <ryanh@us.ibm.com>
---
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@lists.xensource.com
http://lists.xensource.com/xen-devel