From: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
To: Huang Ying <ying.huang@intel.com>
Cc: Ingo Molnar <mingo@elte.hu>, "H. Peter Anvin" <hpa@zytor.com>,
Andi Kleen <ak@linux.intel.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: [PATCH 3/5] mce-inject: make injected mce valid only during faked handler call
Date: Mon, 28 Sep 2009 15:52:56 +0900 [thread overview]
Message-ID: <4AC05D48.1000007@jp.fujitsu.com> (raw)
In-Reply-To: <4AC05BBF.3010102@jp.fujitsu.com>
In the current implementation, injected MCE is valid from the point
the MCE is injected to the point the MCE is processed by the faked
handler call.
This has an undesired side-effect: it is possible for it to be
consumed by real machine_check_poll. This may confuse a real system
error and may confuse the mce test suite.
To fix this, this patch changes mce_rdmsrl/wemsrl() to refer injected
data only when injectm.valid states 3rd state "2", which indicates that
the injected MCE entry is valid and ready for the handler.
The injectm.valid becomes "2" only during faked MCE handler call
and protected by IRQ disabling. This make it impossible for real
machine_check_poll to consume it.
Reported-by: Huang Ying <ying.huang@intel.com>
Signed-off-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
---
arch/x86/include/asm/mce.h | 2 +-
arch/x86/kernel/cpu/mcheck/mce-inject.c | 17 +++++++++++++++--
arch/x86/kernel/cpu/mcheck/mce.c | 4 ++--
3 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h
index 995dfd2..fd9c3ca 100644
--- a/arch/x86/include/asm/mce.h
+++ b/arch/x86/include/asm/mce.h
@@ -63,7 +63,7 @@ struct mce {
__u8 cs; /* code segment */
__u8 bank; /* machine check bank */
__u8 cpu; /* cpu number; obsolete; use extcpu now */
- __u8 valid; /* entry is valid */
+ __u8 valid; /* 1: entry is valid, 2: valid as fake (injectm) */
__u32 extcpu; /* linux cpu number that detected the error */
__u32 socketid; /* CPU socket ID */
__u32 apicid; /* CPU initial apic ID */
diff --git a/arch/x86/kernel/cpu/mcheck/mce-inject.c b/arch/x86/kernel/cpu/mcheck/mce-inject.c
index 5bac818..702f712 100644
--- a/arch/x86/kernel/cpu/mcheck/mce-inject.c
+++ b/arch/x86/kernel/cpu/mcheck/mce-inject.c
@@ -50,10 +50,12 @@ static void raise_poll(struct mce *m)
mce_banks_t b;
memset(&b, 0xff, sizeof(mce_banks_t));
+
local_irq_save(flags);
+ m->valid = 2;
machine_check_poll(0, &b);
- local_irq_restore(flags);
m->valid = 0;
+ local_irq_restore(flags);
}
static void raise_exception(struct mce *m, struct pt_regs *pregs)
@@ -67,11 +69,13 @@ static void raise_exception(struct mce *m, struct pt_regs *pregs)
regs.cs = m->cs;
pregs = ®s;
}
+
/* in mcheck exeception handler, irq will be disabled */
local_irq_save(flags);
+ m->valid = 2;
do_machine_check(pregs, 0);
- local_irq_restore(flags);
m->valid = 0;
+ local_irq_restore(flags);
}
static cpumask_t mce_inject_cpumask;
@@ -82,13 +86,19 @@ static int mce_raise_notify(struct notifier_block *self,
struct die_args *args = (struct die_args *)data;
int cpu = smp_processor_id();
struct mce *m = &__get_cpu_var(injectm);
+
if (val != DIE_NMI_IPI || !cpu_isset(cpu, mce_inject_cpumask))
return NOTIFY_DONE;
cpu_clear(cpu, mce_inject_cpumask);
+
+ if (!m->valid)
+ return NOTIFY_STOP;
+
if (m->inject_flags & MCE_INJ_EXCEPTION)
raise_exception(m, args->regs);
else if (m->status)
raise_poll(m);
+
return NOTIFY_STOP;
}
@@ -105,6 +115,9 @@ static int raise_local(void)
int ret = 0;
int cpu = m->extcpu;
+ if (!m->valid)
+ return 0;
+
if (m->inject_flags & MCE_INJ_EXCEPTION) {
printk(KERN_INFO "Triggering MCE exception on CPU %d\n", cpu);
switch (context) {
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c
index ac4f478..aeab37a 100644
--- a/arch/x86/kernel/cpu/mcheck/mce.c
+++ b/arch/x86/kernel/cpu/mcheck/mce.c
@@ -306,7 +306,7 @@ static u64 mce_rdmsrl(u32 msr)
{
u64 v;
- if (__get_cpu_var(injectm).valid) {
+ if (__get_cpu_var(injectm).valid > 1) {
int offset = msr_to_offset(msr);
if (offset < 0)
@@ -329,7 +329,7 @@ static u64 mce_rdmsrl(u32 msr)
static void mce_wrmsrl(u32 msr, u64 v)
{
- if (__get_cpu_var(injectm).valid) {
+ if (__get_cpu_var(injectm).valid > 1) {
int offset = msr_to_offset(msr);
if (offset >= 0)
--
1.6.4.3
next prev parent reply other threads:[~2009-09-28 6:53 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-28 1:21 [BUGFIX -v2] x86, mce, inject: Make injected mce valid only during faked handler call Huang Ying
2009-09-28 6:40 ` Hidetoshi Seto
2009-09-28 7:09 ` Huang Ying
2009-09-28 8:02 ` Hidetoshi Seto
2009-09-28 8:27 ` Huang Ying
2009-09-28 8:59 ` Hidetoshi Seto
2009-09-28 9:15 ` Huang Ying
2009-09-28 6:46 ` [PATCH 0/5] x86, mce-inject: misc fix Hidetoshi Seto
2009-09-28 6:51 ` [PATCH 1/5] mce-inject: replace MCJ_ to MCE_INJ_ Hidetoshi Seto
2009-09-28 6:51 ` [PATCH 2/5] x86, mce: rename finished to valid in struct mce Hidetoshi Seto
2009-09-28 18:24 ` Andi Kleen
2009-09-29 8:40 ` Hidetoshi Seto
2009-09-29 23:02 ` Andi Kleen
2009-09-29 23:04 ` [PATCH 2/5] x86, mce: rename finished to valid in struct mce II Andi Kleen
2009-09-29 23:20 ` H. Peter Anvin
2009-09-30 4:39 ` Andi Kleen
2009-10-01 11:08 ` Ingo Molnar
2009-09-28 6:52 ` Hidetoshi Seto [this message]
2009-09-28 7:27 ` [PATCH 3/5] mce-inject: make injected mce valid only during faked handler call Huang Ying
2009-09-28 18:50 ` Andi Kleen
2009-09-29 8:42 ` Hidetoshi Seto
2009-09-29 20:45 ` Andi Kleen
2009-09-28 6:53 ` [PATCH 4/5] mce-inject: no wait on write with MCE_INJ_CTX_RANDOM Hidetoshi Seto
2009-09-28 6:54 ` [PATCH 5/5] mce-inject: allow injecting status=0 to poll handler Hidetoshi Seto
2009-10-05 2:52 ` [PATCH 0/6] x86, mce, mce-inject: misc fix v2 Hidetoshi Seto
2009-10-05 3:05 ` [PATCH 1/6] x86, mce: replace MCJ_ to MCE_INJ_ Hidetoshi Seto
2009-10-05 3:06 ` [PATCH 2/6] x86, mce: replace MCM_ to MCI_MISC_ Hidetoshi Seto
2009-10-05 3:07 ` [PATCH 3/6] mce-inject: no wait on write with MCE_INJ_CTX_RANDOM Hidetoshi Seto
2009-10-05 3:07 ` [PATCH 4/6] mce-inject: allow injecting status=0 to poll handler Hidetoshi Seto
2009-10-05 3:08 ` [PATCH 5/6] mce-inject: add a barrier to raise_mce() Hidetoshi Seto
2009-10-05 3:10 ` [PATCH 6/6] mce-inject: use injected mce only during faked handler call Hidetoshi Seto
2009-10-09 1:54 ` Huang Ying
2009-10-09 5:38 ` Hidetoshi Seto
2009-10-09 5:44 ` [PATCH 1/4] mce-inject: make raise_global() Hidetoshi Seto
2009-10-09 5:45 ` [PATCH 2/4] mce-inject: use individual members instead of struct mce Hidetoshi Seto
2009-10-09 6:50 ` Huang Ying
2009-10-09 7:18 ` Hidetoshi Seto
2009-10-09 5:45 ` [PATCH 3/4] mce-inject: change msr_to_offset() to mce_get_fake_reg() Hidetoshi Seto
2009-10-09 5:46 ` [PATCH 4/4] mce-inject: support injecting multiple error to a CPU Hidetoshi Seto
2009-10-09 7:14 ` [PATCH 6/6] mce-inject: use injected mce only during faked handler call Huang Ying
2009-10-09 7:27 ` Hidetoshi Seto
2009-10-09 7:44 ` Huang Ying
2009-10-09 8:31 ` Hidetoshi Seto
2009-10-09 9:11 ` Huang Ying
2009-10-13 2:34 ` Hidetoshi Seto
2009-10-13 3:28 ` Huang Ying
2009-10-13 6:00 ` Hidetoshi Seto
2009-10-13 6:19 ` Huang Ying
2009-10-13 6:29 ` Ingo Molnar
2009-10-13 7:19 ` [RFC] x86, mce: use of TRACE_EVENT for mce Hidetoshi Seto
2009-10-13 8:43 ` Ingo Molnar
2009-10-13 8:46 ` [tip:perf/mce] perf_event, x86, mce: Use TRACE_EVENT() for MCE logging tip-bot for Hidetoshi Seto
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=4AC05D48.1000007@jp.fujitsu.com \
--to=seto.hidetoshi@jp.fujitsu.com \
--cc=ak@linux.intel.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=ying.huang@intel.com \
/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).