If domain_crash_synchronous() is called in the context of a multicall,
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Fri, 10 Nov 2006 17:47:15 +0000 (17:47 +0000)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Fri, 10 Nov 2006 17:47:15 +0000 (17:47 +0000)
the (physical) CPU this was executing on did not get its multicall
state cleared and would reject any further multicalls, likely leading
to crashing dom0 at some point.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
xen/common/domain.c

index 08327a37fd135d92c500e0795cf139edf58ddd06..2eac2ed7edff09708c7ead5bfe6d55391a3379a4 100644 (file)
@@ -22,6 +22,7 @@
 #include <xen/delay.h>
 #include <xen/shutdown.h>
 #include <xen/percpu.h>
+#include <xen/multicall.h>
 #include <asm/debugger.h>
 #include <public/sched.h>
 #include <public/vcpu.h>
@@ -256,6 +257,10 @@ void __domain_crash(struct domain *d)
 void __domain_crash_synchronous(void)
 {
     __domain_crash(current->domain);
+
+    /* Flush multicall state before dying. */
+    this_cpu(mc_state).flags = 0;
+
     for ( ; ; )
         do_softirq();
 }