From: Huang Ying <ying.huang@intel.com>
To: Ingo Molnar <mingo@elte.hu>, "H. Peter Anvin" <hpa@zytor.com>
Cc: linux-kernel@vger.kernel.org, Andi Kleen <andi@firstfloor.org>,
Peter Zijlstra <peterz@infradead.org>,
Huang Ying <ying.huang@intel.com>
Subject: [RFC 4/5] x86, Use NMI return notifier in MCE
Date: Thu, 24 Jun 2010 11:04:57 +0800 [thread overview]
Message-ID: <1277348698-17311-4-git-send-email-ying.huang@intel.com> (raw)
In-Reply-To: <1277348698-17311-1-git-send-email-ying.huang@intel.com>
Use general NMI return notifier mechanism to replace the self
interrupt used in MCE handler.
Signed-off-by: Huang Ying <ying.huang@intel.com>
---
arch/x86/include/asm/entry_arch.h | 4 --
arch/x86/include/asm/irq_vectors.h | 5 ---
arch/x86/kernel/cpu/mcheck/mce.c | 50 +++++--------------------------------
arch/x86/kernel/entry_64.S | 5 ---
arch/x86/kernel/irqinit.c | 3 --
5 files changed, 7 insertions(+), 60 deletions(-)
--- a/arch/x86/include/asm/entry_arch.h
+++ b/arch/x86/include/asm/entry_arch.h
@@ -61,8 +61,4 @@ BUILD_INTERRUPT(thermal_interrupt,THERMA
BUILD_INTERRUPT(threshold_interrupt,THRESHOLD_APIC_VECTOR)
#endif
-#ifdef CONFIG_X86_MCE
-BUILD_INTERRUPT(mce_self_interrupt,MCE_SELF_VECTOR)
-#endif
-
#endif
--- a/arch/x86/include/asm/irq_vectors.h
+++ b/arch/x86/include/asm/irq_vectors.h
@@ -121,11 +121,6 @@
#define UV_BAU_MESSAGE 0xea
/*
- * Self IPI vector for machine checks
- */
-#define MCE_SELF_VECTOR 0xeb
-
-/*
* Self IPI vector for NMI return notifier
*/
#define NMI_RETURN_NOTIFIER_VECTOR 0xe9
--- a/arch/x86/kernel/cpu/mcheck/mce.c
+++ b/arch/x86/kernel/cpu/mcheck/mce.c
@@ -480,60 +480,24 @@ static inline void mce_get_rip(struct mc
m->ip = mce_rdmsrl(rip_msr);
}
-#ifdef CONFIG_X86_LOCAL_APIC
-/*
- * Called after interrupts have been reenabled again
- * when a MCE happened during an interrupts off region
- * in the kernel.
- */
-asmlinkage void smp_mce_self_interrupt(struct pt_regs *regs)
+static void __mce_report_event(struct nmi_return_notifier *nrn)
{
- ack_APIC_irq();
- exit_idle();
- irq_enter();
mce_notify_irq();
mce_schedule_work();
- irq_exit();
}
-#endif
+
+static DEFINE_PER_CPU(struct nmi_return_notifier, mce_nrn) = {
+ .on_nmi_return = __mce_report_event,
+};
static void mce_report_event(struct pt_regs *regs)
{
if (regs->flags & (X86_VM_MASK|X86_EFLAGS_IF)) {
- mce_notify_irq();
- /*
- * Triggering the work queue here is just an insurance
- * policy in case the syscall exit notify handler
- * doesn't run soon enough or ends up running on the
- * wrong CPU (can happen when audit sleeps)
- */
- mce_schedule_work();
+ __mce_report_event(NULL);
return;
}
-#ifdef CONFIG_X86_LOCAL_APIC
- /*
- * Without APIC do not notify. The event will be picked
- * up eventually.
- */
- if (!cpu_has_apic)
- return;
-
- /*
- * When interrupts are disabled we cannot use
- * kernel services safely. Trigger an self interrupt
- * through the APIC to instead do the notification
- * after interrupts are reenabled again.
- */
- apic->send_IPI_self(MCE_SELF_VECTOR);
-
- /*
- * Wait for idle afterwards again so that we don't leave the
- * APIC in a non idle state because the normal APIC writes
- * cannot exclude us.
- */
- apic_wait_icr_idle();
-#endif
+ nmi_return_notifier_schedule(&__get_cpu_var(mce_nrn));
}
DEFINE_PER_CPU(unsigned, mce_poll_count);
--- a/arch/x86/kernel/entry_64.S
+++ b/arch/x86/kernel/entry_64.S
@@ -1004,11 +1004,6 @@ apicinterrupt THRESHOLD_APIC_VECTOR \
apicinterrupt THERMAL_APIC_VECTOR \
thermal_interrupt smp_thermal_interrupt
-#ifdef CONFIG_X86_MCE
-apicinterrupt MCE_SELF_VECTOR \
- mce_self_interrupt smp_mce_self_interrupt
-#endif
-
#ifdef CONFIG_X86_LOCAL_APIC
apicinterrupt NMI_RETURN_NOTIFIER_VECTOR \
nmi_return_notifier_interrupt smp_nmi_return_notifier_interrupt
--- a/arch/x86/kernel/irqinit.c
+++ b/arch/x86/kernel/irqinit.c
@@ -209,9 +209,6 @@ static void __init apic_intr_init(void)
#ifdef CONFIG_X86_MCE_THRESHOLD
alloc_intr_gate(THRESHOLD_APIC_VECTOR, threshold_interrupt);
#endif
-#if defined(CONFIG_X86_MCE) && defined(CONFIG_X86_LOCAL_APIC)
- alloc_intr_gate(MCE_SELF_VECTOR, mce_self_interrupt);
-#endif
#ifdef CONFIG_X86_LOCAL_APIC
alloc_intr_gate(NMI_RETURN_NOTIFIER_VECTOR, nmi_return_notifier_interrupt);
#endif
next prev parent reply other threads:[~2010-06-24 3:05 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-24 3:04 [RFC 1/5] Make soft_irq NMI safe Huang Ying
2010-06-24 3:04 ` [RFC 2/5] NMI return notifier Huang Ying
2010-06-24 3:04 ` [RFC 3/5] x86, trigger NMI return notifier soft_irq earlier Huang Ying
2010-06-24 6:03 ` Peter Zijlstra
2010-06-24 3:04 ` Huang Ying [this message]
2010-06-24 10:00 ` [RFC 4/5] x86, Use NMI return notifier in MCE Andi Kleen
2010-06-24 3:04 ` [RFC 5/5] Use NMI return notifier in perf pending Huang Ying
2010-06-24 6:00 ` Peter Zijlstra
2010-06-24 6:09 ` [RFC 1/5] Make soft_irq NMI safe Peter Zijlstra
2010-06-24 6:45 ` Huang Ying
2010-06-24 6:35 ` [RFC][PATCH] irq_work Peter Zijlstra
2010-06-24 6:43 ` Huang Ying
2010-06-24 6:47 ` Peter Zijlstra
2010-06-24 6:50 ` Huang Ying
2010-06-24 6:58 ` Peter Zijlstra
2010-06-24 7:04 ` Huang Ying
2010-06-24 7:19 ` Peter Zijlstra
2010-06-24 7:27 ` Huang Ying
2010-06-24 7:32 ` Peter Zijlstra
2010-06-24 10:27 ` Andi Kleen
2010-06-24 10:30 ` Peter Zijlstra
2010-06-24 10:52 ` Andi Kleen
2010-06-24 10:58 ` Peter Zijlstra
2010-06-24 11:08 ` Andi Kleen
2010-06-24 11:10 ` Peter Zijlstra
2010-06-24 11:20 ` Andi Kleen
2010-06-24 11:33 ` Peter Zijlstra
2010-06-24 11:55 ` Andi Kleen
2010-06-24 11:57 ` Peter Zijlstra
2010-06-24 12:02 ` Andi Kleen
2010-06-24 12:18 ` Peter Zijlstra
2010-06-24 12:38 ` Andi Kleen
2010-06-25 10:38 ` Peter Zijlstra
2010-06-24 11:42 ` Peter Zijlstra
2010-06-24 11:58 ` Andi Kleen
2010-06-24 12:02 ` Peter Zijlstra
2010-06-24 11:23 ` Ingo Molnar
2010-06-24 11:34 ` Peter Zijlstra
2010-06-24 12:35 ` Ingo Molnar
2010-06-24 13:02 ` Andi Kleen
2010-06-24 13:20 ` Borislav Petkov
2010-06-24 13:33 ` Andi Kleen
2010-06-24 13:42 ` Ingo Molnar
2010-06-24 13:46 ` Ingo Molnar
2010-06-24 14:01 ` Andi Kleen
2010-06-24 15:41 ` Borislav Petkov
2010-06-24 16:09 ` Andi Kleen
2010-06-25 2:12 ` Huang Ying
2010-06-25 7:48 ` Peter Zijlstra
2010-06-25 9:17 ` Huang Ying
2010-06-25 9:23 ` Frederic Weisbecker
2010-06-25 9:30 ` Huang Ying
2010-06-25 9:44 ` Frederic Weisbecker
2010-06-25 9:30 ` Peter Zijlstra
2010-06-25 11:58 ` huang ying
2010-06-25 9:08 ` Andi Kleen
2010-06-25 18:30 ` [RFC][PATCH] irq_work -v2 Peter Zijlstra
2010-06-25 19:30 ` Andi Kleen
2010-06-25 19:39 ` Peter Zijlstra
2010-06-25 19:49 ` Peter Zijlstra
2010-06-25 22:29 ` Andi Kleen
2010-06-26 8:36 ` Peter Zijlstra
2010-06-26 10:08 ` Andi Kleen
2010-06-26 10:32 ` Peter Zijlstra
2010-06-25 19:47 ` Peter Zijlstra
2010-06-26 1:26 ` huang ying
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1277348698-17311-4-git-send-email-ying.huang@intel.com \
--to=ying.huang@intel.com \
--cc=andi@firstfloor.org \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).