[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |