* [PATCH] [RESEND] x86: add IRQ context simulation in module mce-inject
@ 2011-11-04 7:14 Chen Gong
0 siblings, 0 replies; 4+ messages in thread
From: Chen Gong @ 2011-11-04 7:14 UTC (permalink / raw)
To: tony.luck; +Cc: andi.kleen, linux-kernel, Chen Gong
module mce-inject is an interface which is used by user space app
such as mce-inject. According to it one can inject all kinds of
error combinations into the kernel. In this way, one can check
error condition coverage in the kernel. To satisify this needs,
module mce-inject must simulate enough scenarios such as process
context, IRQ context, even NMI context, to ensure related kernel
codes are strong and reliable. In current implementation, IRQ
context hasn't been simulated. This patch is for this purpose.
Signed-off-by: Chen Gong <gong.chen@linux.intel.com>
---
arch/x86/include/asm/mce.h | 9 ++++---
arch/x86/kernel/cpu/mcheck/mce-inject.c | 34 +++++++++++++++++++++++++++---
2 files changed, 35 insertions(+), 8 deletions(-)
diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h
index c9321f3..312d770 100644
--- a/arch/x86/include/asm/mce.h
+++ b/arch/x86/include/asm/mce.h
@@ -50,10 +50,11 @@
#define MCJ_CTX_MASK 3
#define MCJ_CTX(flags) ((flags) & MCJ_CTX_MASK)
#define MCJ_CTX_RANDOM 0 /* inject context: random */
-#define MCJ_CTX_PROCESS 1 /* inject context: process */
-#define MCJ_CTX_IRQ 2 /* inject context: IRQ */
-#define MCJ_NMI_BROADCAST 4 /* do NMI broadcasting */
-#define MCJ_EXCEPTION 8 /* raise as exception */
+#define MCJ_CTX_PROCESS 0x1 /* inject context: process */
+#define MCJ_CTX_IRQ 0x2 /* inject context: IRQ */
+#define MCJ_NMI_BROADCAST 0x4 /* do NMI broadcasting */
+#define MCJ_EXCEPTION 0x8 /* raise as exception */
+#define MCJ_IRQ_BRAODCAST 0x10 /* do IRQ broadcasting */
/* Fields are zero when not available */
struct mce {
diff --git a/arch/x86/kernel/cpu/mcheck/mce-inject.c b/arch/x86/kernel/cpu/mcheck/mce-inject.c
index 6199232..505461e 100644
--- a/arch/x86/kernel/cpu/mcheck/mce-inject.c
+++ b/arch/x86/kernel/cpu/mcheck/mce-inject.c
@@ -17,6 +17,7 @@
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/fs.h>
+#include <linux/preempt.h>
#include <linux/smp.h>
#include <linux/notifier.h>
#include <linux/kdebug.h>
@@ -92,6 +93,18 @@ static int mce_raise_notify(unsigned int cmd, struct pt_regs *regs)
return NMI_HANDLED;
}
+static void mce_irq_ipi(void *info)
+{
+ int cpu = smp_processor_id();
+ struct mce *m = &__get_cpu_var(injectm);
+
+ if (cpumask_test_cpu(cpu, mce_inject_cpumask) &&
+ m->inject_flags & MCJ_EXCEPTION) {
+ cpumask_clear_cpu(cpu, mce_inject_cpumask);
+ raise_exception(m, NULL);
+ }
+}
+
/* Inject mce on current CPU */
static int raise_local(void)
{
@@ -139,9 +152,10 @@ static void raise_mce(struct mce *m)
return;
#ifdef CONFIG_X86_LOCAL_APIC
- if (m->inject_flags & MCJ_NMI_BROADCAST) {
+ if (m->inject_flags & (MCJ_IRQ_BRAODCAST | MCJ_NMI_BROADCAST)) {
unsigned long start;
int cpu;
+
get_online_cpus();
cpumask_copy(mce_inject_cpumask, cpu_online_mask);
cpumask_clear_cpu(get_cpu(), mce_inject_cpumask);
@@ -151,13 +165,25 @@ static void raise_mce(struct mce *m)
MCJ_CTX(mcpu->inject_flags) != MCJ_CTX_RANDOM)
cpumask_clear_cpu(cpu, mce_inject_cpumask);
}
- if (!cpumask_empty(mce_inject_cpumask))
- apic->send_IPI_mask(mce_inject_cpumask, NMI_VECTOR);
+ if (!cpumask_empty(mce_inject_cpumask)) {
+ if (m->inject_flags & MCJ_IRQ_BRAODCAST) {
+ /*
+ * don't wait because mce_irq_ipi is necessary
+ * to be sync with following raise_local
+ */
+ preempt_disable();
+ smp_call_function_many(mce_inject_cpumask,
+ mce_irq_ipi, NULL, 0);
+ preempt_enable();
+ } else if (m->inject_flags & MCJ_NMI_BROADCAST)
+ apic->send_IPI_mask(mce_inject_cpumask,
+ NMI_VECTOR);
+ }
start = jiffies;
while (!cpumask_empty(mce_inject_cpumask)) {
if (!time_before(jiffies, start + 2*HZ)) {
printk(KERN_ERR
- "Timeout waiting for mce inject NMI %lx\n",
+ "Timeout waiting for mce inject %lx\n",
*cpumask_bits(mce_inject_cpumask));
break;
}
--
1.7.7.rc0.70.g82660
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH ] [RESEND] x86: add IRQ context simulation in module mce-inject
@ 2011-11-16 2:35 Chen Gong
2011-11-16 2:35 ` [PATCH] " Chen Gong
2011-11-19 13:32 ` [PATCH ] " Chen Gong
0 siblings, 2 replies; 4+ messages in thread
From: Chen Gong @ 2011-11-16 2:35 UTC (permalink / raw)
To: tony.luck; +Cc: andi.kleen, x86, linux-kernel
resend this patch including x86@kernel.org maillist.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH] [RESEND] x86: add IRQ context simulation in module mce-inject
2011-11-16 2:35 [PATCH ] [RESEND] x86: add IRQ context simulation in module mce-inject Chen Gong
@ 2011-11-16 2:35 ` Chen Gong
2011-11-19 13:32 ` [PATCH ] " Chen Gong
1 sibling, 0 replies; 4+ messages in thread
From: Chen Gong @ 2011-11-16 2:35 UTC (permalink / raw)
To: tony.luck; +Cc: andi.kleen, x86, linux-kernel, Chen Gong
module mce-inject is an interface which is used by user space app
such as mce-inject. According to it one can inject all kinds of
error combinations into the kernel. In this way, one can check
error condition coverage in the kernel. To satisify this needs,
module mce-inject must simulate enough scenarios such as process
context, IRQ context, even NMI context, to ensure related kernel
codes are strong and reliable. In current implementation, IRQ
context hasn't been simulated. This patch is for this purpose.
Signed-off-by: Chen Gong <gong.chen@linux.intel.com>
---
arch/x86/include/asm/mce.h | 9 ++++---
arch/x86/kernel/cpu/mcheck/mce-inject.c | 34 +++++++++++++++++++++++++++---
2 files changed, 35 insertions(+), 8 deletions(-)
diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h
index c9321f3..312d770 100644
--- a/arch/x86/include/asm/mce.h
+++ b/arch/x86/include/asm/mce.h
@@ -50,10 +50,11 @@
#define MCJ_CTX_MASK 3
#define MCJ_CTX(flags) ((flags) & MCJ_CTX_MASK)
#define MCJ_CTX_RANDOM 0 /* inject context: random */
-#define MCJ_CTX_PROCESS 1 /* inject context: process */
-#define MCJ_CTX_IRQ 2 /* inject context: IRQ */
-#define MCJ_NMI_BROADCAST 4 /* do NMI broadcasting */
-#define MCJ_EXCEPTION 8 /* raise as exception */
+#define MCJ_CTX_PROCESS 0x1 /* inject context: process */
+#define MCJ_CTX_IRQ 0x2 /* inject context: IRQ */
+#define MCJ_NMI_BROADCAST 0x4 /* do NMI broadcasting */
+#define MCJ_EXCEPTION 0x8 /* raise as exception */
+#define MCJ_IRQ_BRAODCAST 0x10 /* do IRQ broadcasting */
/* Fields are zero when not available */
struct mce {
diff --git a/arch/x86/kernel/cpu/mcheck/mce-inject.c b/arch/x86/kernel/cpu/mcheck/mce-inject.c
index 6199232..505461e 100644
--- a/arch/x86/kernel/cpu/mcheck/mce-inject.c
+++ b/arch/x86/kernel/cpu/mcheck/mce-inject.c
@@ -17,6 +17,7 @@
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/fs.h>
+#include <linux/preempt.h>
#include <linux/smp.h>
#include <linux/notifier.h>
#include <linux/kdebug.h>
@@ -92,6 +93,18 @@ static int mce_raise_notify(unsigned int cmd, struct pt_regs *regs)
return NMI_HANDLED;
}
+static void mce_irq_ipi(void *info)
+{
+ int cpu = smp_processor_id();
+ struct mce *m = &__get_cpu_var(injectm);
+
+ if (cpumask_test_cpu(cpu, mce_inject_cpumask) &&
+ m->inject_flags & MCJ_EXCEPTION) {
+ cpumask_clear_cpu(cpu, mce_inject_cpumask);
+ raise_exception(m, NULL);
+ }
+}
+
/* Inject mce on current CPU */
static int raise_local(void)
{
@@ -139,9 +152,10 @@ static void raise_mce(struct mce *m)
return;
#ifdef CONFIG_X86_LOCAL_APIC
- if (m->inject_flags & MCJ_NMI_BROADCAST) {
+ if (m->inject_flags & (MCJ_IRQ_BRAODCAST | MCJ_NMI_BROADCAST)) {
unsigned long start;
int cpu;
+
get_online_cpus();
cpumask_copy(mce_inject_cpumask, cpu_online_mask);
cpumask_clear_cpu(get_cpu(), mce_inject_cpumask);
@@ -151,13 +165,25 @@ static void raise_mce(struct mce *m)
MCJ_CTX(mcpu->inject_flags) != MCJ_CTX_RANDOM)
cpumask_clear_cpu(cpu, mce_inject_cpumask);
}
- if (!cpumask_empty(mce_inject_cpumask))
- apic->send_IPI_mask(mce_inject_cpumask, NMI_VECTOR);
+ if (!cpumask_empty(mce_inject_cpumask)) {
+ if (m->inject_flags & MCJ_IRQ_BRAODCAST) {
+ /*
+ * don't wait because mce_irq_ipi is necessary
+ * to be sync with following raise_local
+ */
+ preempt_disable();
+ smp_call_function_many(mce_inject_cpumask,
+ mce_irq_ipi, NULL, 0);
+ preempt_enable();
+ } else if (m->inject_flags & MCJ_NMI_BROADCAST)
+ apic->send_IPI_mask(mce_inject_cpumask,
+ NMI_VECTOR);
+ }
start = jiffies;
while (!cpumask_empty(mce_inject_cpumask)) {
if (!time_before(jiffies, start + 2*HZ)) {
printk(KERN_ERR
- "Timeout waiting for mce inject NMI %lx\n",
+ "Timeout waiting for mce inject %lx\n",
*cpumask_bits(mce_inject_cpumask));
break;
}
--
1.7.7.rc0.70.g82660
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH ] [RESEND] x86: add IRQ context simulation in module mce-inject
2011-11-16 2:35 [PATCH ] [RESEND] x86: add IRQ context simulation in module mce-inject Chen Gong
2011-11-16 2:35 ` [PATCH] " Chen Gong
@ 2011-11-19 13:32 ` Chen Gong
1 sibling, 0 replies; 4+ messages in thread
From: Chen Gong @ 2011-11-19 13:32 UTC (permalink / raw)
To: linux-kernel@vger.kernel.org; +Cc: tony.luck, andi.kleen, x86, linux-kernel
于 2011/11/16 10:35, Chen Gong 写道:
> resend this patch including x86@kernel.org maillist.
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
any comments?
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-11-19 13:32 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-16 2:35 [PATCH ] [RESEND] x86: add IRQ context simulation in module mce-inject Chen Gong
2011-11-16 2:35 ` [PATCH] " Chen Gong
2011-11-19 13:32 ` [PATCH ] " Chen Gong
-- strict thread matches above, loose matches on Subject: below --
2011-11-04 7:14 [PATCH] " Chen Gong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox