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

[Xen-changelog] [xen-unstable] x86: Must use a softirq to defer dom0 NMI



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1213795030 -3600
# Node ID b55f6d42668d862170df03dc42995a0600f93fc6
# Parent  52592af0204a55abd0898b1fbe390a55036079e2
x86: Must use a softirq to defer dom0 NMI
notification. tasklet_schedule() contains a spinlock and is unsafe in
NMI context.

Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/traps.c          |    9 +++++----
 xen/include/asm-x86/softirq.h |    4 +++-
 2 files changed, 8 insertions(+), 5 deletions(-)

diff -r 52592af0204a -r b55f6d42668d xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c      Wed Jun 18 11:55:34 2008 +0100
+++ b/xen/arch/x86/traps.c      Wed Jun 18 14:17:10 2008 +0100
@@ -2678,14 +2678,12 @@ asmlinkage void do_general_protection(st
     panic("GENERAL PROTECTION FAULT\n[error_code=%04x]\n", regs->error_code);
 }
 
-static void nmi_action(unsigned long unused)
+static void nmi_mce_softirq(void)
 {
     /* Only used to defer wakeup of dom0,vcpu0 to a safe (non-NMI) context. */
     vcpu_kick(dom0->vcpu[0]);
 }
 
-static DECLARE_TASKLET(nmi_tasklet, nmi_action, 0);
-
 static void nmi_dom0_report(unsigned int reason_idx)
 {
     struct domain *d;
@@ -2696,8 +2694,9 @@ static void nmi_dom0_report(unsigned int
 
     set_bit(reason_idx, nmi_reason(d));
 
+    /* Not safe to wake a vcpu here, or even to schedule a tasklet! */
     if ( !test_and_set_bool(v->nmi_pending) )
-        tasklet_schedule(&nmi_tasklet); /* not safe to wake a vcpu here */
+        raise_softirq(NMI_MCE_SOFTIRQ);
 }
 
 asmlinkage void mem_parity_error(struct cpu_user_regs *regs)
@@ -2975,6 +2974,8 @@ void __init trap_init(void)
     percpu_traps_init();
 
     cpu_init();
+
+    open_softirq(NMI_MCE_SOFTIRQ, nmi_mce_softirq);
 }
 
 long register_guest_nmi_callback(unsigned long address)
diff -r 52592af0204a -r b55f6d42668d xen/include/asm-x86/softirq.h
--- a/xen/include/asm-x86/softirq.h     Wed Jun 18 11:55:34 2008 +0100
+++ b/xen/include/asm-x86/softirq.h     Wed Jun 18 14:17:10 2008 +0100
@@ -1,6 +1,8 @@
 #ifndef __ASM_SOFTIRQ_H__
 #define __ASM_SOFTIRQ_H__
 
-#define NR_ARCH_SOFTIRQS    0
+#define NMI_MCE_SOFTIRQ     (NR_COMMON_SOFTIRQS + 0)
+
+#define NR_ARCH_SOFTIRQS    1
 
 #endif /* __ASM_SOFTIRQ_H__ */

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


 


Rackspace

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