mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 0/6] x86, NMI: die_notifier and default_do_nmi cleanups
@ 2011-01-06 21:18 Don Zickus
  2011-01-06 21:18 ` [PATCH 1/6] x86, NMI: Add NMI symbol constants and rename memory parity to PCI SERR Don Zickus
                   ` (7 more replies)
  0 siblings, 8 replies; 31+ messages in thread
From: Don Zickus @ 2011-01-06 21:18 UTC (permalink / raw)
  To: x86
  Cc: Peter Zijlstra, Robert Richter, ying.huang, gorcunov, LKML, Don Zickus

This is another version of the NMI rewrite patches I sent previously.  I
take it those patches were too thick to be reviewed easily, so I broke out
the patches differently to make it easier to review.  Hopefully it doesn't
look as scary.

The bulk of the patch adds priorities to the die_chain notifiers for NMI
events and removes the DIE_NMI_IPI event.  There are some other cleanups
too, which include removing the restriction of the BSP cpu to process 
external NMIs.

Cheers,
Don

Don Zickus (5):
  x86: Convert some devices to use DIE_NMIUNKNOWN
  x86, NMI: Add priorities to handlers
  x86, NMI: Remove DIE_NMI_IPI
  x86, NMI: Allow NMI reason io port (0x61) to be processed on any CPU
  x86, NMI: Clean-up default_do_nmi()

Huang Ying (1):
  x86, NMI: Add NMI symbol constants and rename memory parity to PCI
    SERR

 arch/x86/include/asm/kdebug.h           |    1 -
 arch/x86/include/asm/mach_traps.h       |   12 +++-
 arch/x86/include/asm/nmi.h              |   20 ++++++
 arch/x86/kernel/apic/hw_nmi.c           |    3 +-
 arch/x86/kernel/apic/x2apic_uv_x.c      |    2 +-
 arch/x86/kernel/cpu/mcheck/mce-inject.c |    5 +-
 arch/x86/kernel/cpu/perf_event.c        |    3 +-
 arch/x86/kernel/kgdb.c                  |    6 +--
 arch/x86/kernel/reboot.c                |    5 +-
 arch/x86/kernel/traps.c                 |  102 +++++++++++++++---------------
 arch/x86/oprofile/nmi_int.c             |    3 +-
 arch/x86/oprofile/nmi_timer_int.c       |    2 +-
 drivers/char/ipmi/ipmi_watchdog.c       |    2 +-
 drivers/watchdog/hpwdt.c                |    2 +-
 14 files changed, 97 insertions(+), 71 deletions(-)

-- 
1.7.3.4


^ permalink raw reply	[flat|nested] 31+ messages in thread
* [PATCH 1/5] x86, NMI: Add NMI symbol constants and rename memory parity to PCI SERR
@ 2010-10-16  2:22 Don Zickus
  2010-10-16 16:36 ` [tip:perf/core] " tip-bot for Huang Ying
  0 siblings, 1 reply; 31+ messages in thread
From: Don Zickus @ 2010-10-16  2:22 UTC (permalink / raw)
  To: mingo; +Cc: andi, robert.richter, linux-kernel, peterz, ying.huang, Don Zickus

From: Huang Ying <ying.huang@intel.com>

Replace the NMI related magic numbers with symbol constants.

memory parity error is only valid for IBM PC-AT, newer machine use
bit 7 (0x80) of 0x61 port for PCI SERR. While memory error is usually
reported via MCE. So corresponding function name and kernel log string
is changed.

But on some machines, PCI SERR line is still used to report memory
errors. This is used by EDAC, so corresponding EDAC call is reserved.

v3:

- Merge adding symbol constants and renaming patches

v2:

- EDAC call in pci_serr_error is reserved.

Signed-off-by: Huang Ying <ying.huang@intel.com>
Signed-off-by: Don Zickus <dzickus@redhat.com>
---
 arch/x86/include/asm/mach_traps.h |   12 ++++++++-
 arch/x86/kernel/traps.c           |   51 +++++++++++++++++++------------------
 2 files changed, 37 insertions(+), 26 deletions(-)

diff --git a/arch/x86/include/asm/mach_traps.h b/arch/x86/include/asm/mach_traps.h
index f792060..72a8b52 100644
--- a/arch/x86/include/asm/mach_traps.h
+++ b/arch/x86/include/asm/mach_traps.h
@@ -7,9 +7,19 @@
 
 #include <asm/mc146818rtc.h>
 
+#define NMI_REASON_PORT		0x61
+
+#define NMI_REASON_SERR		0x80
+#define NMI_REASON_IOCHK	0x40
+#define NMI_REASON_MASK		(NMI_REASON_SERR | NMI_REASON_IOCHK)
+
+#define NMI_REASON_CLEAR_SERR	0x04
+#define NMI_REASON_CLEAR_IOCHK	0x08
+#define NMI_REASON_CLEAR_MASK	0x0f
+
 static inline unsigned char get_nmi_reason(void)
 {
-	return inb(0x61);
+	return inb(NMI_REASON_PORT);
 }
 
 static inline void reassert_nmi(void)
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 60788de..e04e59b 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -301,15 +301,15 @@ gp_in_kernel:
 }
 
 static notrace __kprobes void
-mem_parity_error(unsigned char reason, struct pt_regs *regs)
+pci_serr_error(unsigned char reason, struct pt_regs *regs)
 {
-	printk(KERN_EMERG
-		"Uhhuh. NMI received for unknown reason %02x on CPU %d.\n",
-			reason, smp_processor_id());
-
-	printk(KERN_EMERG
-		"You have some hardware problem, likely on the PCI bus.\n");
+	pr_emerg("NMI: PCI system error (SERR) for reason %02x on CPU %d.\n",
+		 reason, smp_processor_id());
 
+	/*
+	 * On some machines, PCI SERR line is used to report memory
+	 * errors. EDAC makes use of it.
+	 */
 #if defined(CONFIG_EDAC)
 	if (edac_handler_set()) {
 		edac_atomic_assert_error();
@@ -320,11 +320,11 @@ mem_parity_error(unsigned char reason, struct pt_regs *regs)
 	if (panic_on_unrecovered_nmi)
 		panic("NMI: Not continuing");
 
-	printk(KERN_EMERG "Dazed and confused, but trying to continue\n");
+	pr_emerg("Dazed and confused, but trying to continue\n");
 
-	/* Clear and disable the memory parity error line. */
-	reason = (reason & 0xf) | 4;
-	outb(reason, 0x61);
+	/* Clear and disable the PCI SERR error line. */
+	reason = (reason & NMI_REASON_CLEAR_MASK) | NMI_REASON_CLEAR_SERR;
+	outb(reason, NMI_REASON_PORT);
 }
 
 static notrace __kprobes void
@@ -332,22 +332,24 @@ io_check_error(unsigned char reason, struct pt_regs *regs)
 {
 	unsigned long i;
 
-	printk(KERN_EMERG "NMI: IOCK error (debug interrupt?)\n");
+	pr_emerg(
+	"NMI: IOCK error (debug interrupt?) for reason %02x on CPU %d.\n",
+		 reason, smp_processor_id());
 	show_registers(regs);
 
 	if (panic_on_io_nmi)
 		panic("NMI IOCK error: Not continuing");
 
 	/* Re-enable the IOCK line, wait for a few seconds */
-	reason = (reason & 0xf) | 8;
-	outb(reason, 0x61);
+	reason = (reason & NMI_REASON_CLEAR_MASK) | NMI_REASON_CLEAR_IOCHK;
+	outb(reason, NMI_REASON_PORT);
 
 	i = 2000;
 	while (--i)
 		udelay(1000);
 
-	reason &= ~8;
-	outb(reason, 0x61);
+	reason &= ~NMI_REASON_CLEAR_IOCHK;
+	outb(reason, NMI_REASON_PORT);
 }
 
 static notrace __kprobes void
@@ -366,15 +368,14 @@ unknown_nmi_error(unsigned char reason, struct pt_regs *regs)
 		return;
 	}
 #endif
-	printk(KERN_EMERG
-		"Uhhuh. NMI received for unknown reason %02x on CPU %d.\n",
-			reason, smp_processor_id());
+	pr_emerg("Uhhuh. NMI received for unknown reason %02x on CPU %d.\n",
+		 reason, smp_processor_id());
 
-	printk(KERN_EMERG "Do you have a strange power saving mode enabled?\n");
+	pr_emerg("Do you have a strange power saving mode enabled?\n");
 	if (panic_on_unrecovered_nmi)
 		panic("NMI: Not continuing");
 
-	printk(KERN_EMERG "Dazed and confused, but trying to continue\n");
+	pr_emerg("Dazed and confused, but trying to continue\n");
 }
 
 static notrace __kprobes void default_do_nmi(struct pt_regs *regs)
@@ -388,7 +389,7 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs)
 	if (!cpu)
 		reason = get_nmi_reason();
 
-	if (!(reason & 0xc0)) {
+	if (!(reason & NMI_REASON_MASK)) {
 		if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 2, SIGINT)
 								== NOTIFY_STOP)
 			return;
@@ -418,9 +419,9 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs)
 		return;
 
 	/* AK: following checks seem to be broken on modern chipsets. FIXME */
-	if (reason & 0x80)
-		mem_parity_error(reason, regs);
-	if (reason & 0x40)
+	if (reason & NMI_REASON_SERR)
+		pci_serr_error(reason, regs);
+	if (reason & NMI_REASON_IOCHK)
 		io_check_error(reason, regs);
 #ifdef CONFIG_X86_32
 	/*
-- 
1.7.2.3


^ permalink raw reply	[flat|nested] 31+ messages in thread

end of thread, other threads:[~2011-02-28 18:48 UTC | newest]

Thread overview: 31+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-06 21:18 [PATCH 0/6] x86, NMI: die_notifier and default_do_nmi cleanups Don Zickus
2011-01-06 21:18 ` [PATCH 1/6] x86, NMI: Add NMI symbol constants and rename memory parity to PCI SERR Don Zickus
2011-01-07 15:33   ` [tip:perf/core] " tip-bot for Huang Ying
2011-01-06 21:18 ` [PATCH 2/6] x86: Convert some devices to use DIE_NMIUNKNOWN Don Zickus
2011-01-07 15:34   ` [tip:perf/core] " tip-bot for Don Zickus
2011-01-06 21:18 ` [PATCH 3/6] x86, NMI: Add priorities to handlers Don Zickus
2011-01-07 13:09   ` Peter Zijlstra
2011-01-07 14:43     ` Don Zickus
2011-01-07 14:50       ` Peter Zijlstra
2011-01-07 17:48         ` Don Zickus
2011-01-07 15:34   ` [tip:perf/core] " tip-bot for Don Zickus
2011-01-06 21:18 ` [PATCH 4/6] x86, NMI: Remove DIE_NMI_IPI Don Zickus
2011-01-07 15:34   ` [tip:perf/core] " tip-bot for Don Zickus
2011-01-06 21:18 ` [PATCH 5/6] x86, NMI: Allow NMI reason io port (0x61) to be processed on any CPU Don Zickus
2011-01-07 15:34   ` [tip:perf/core] " tip-bot for Don Zickus
2011-02-23  2:39   ` [PATCH 5/6] " Maciej W. Rozycki
2011-02-25 21:45     ` Don Zickus
2011-02-26  8:02     ` Cyrill Gorcunov
2011-02-26 11:19       ` huang ying
2011-02-26 12:34         ` Cyrill Gorcunov
2011-02-26 14:07           ` huang ying
2011-02-26 15:09             ` Cyrill Gorcunov
2011-02-27  1:01               ` huang ying
2011-02-27 11:19                 ` Cyrill Gorcunov
2011-02-28 18:37                   ` Don Zickus
2011-02-28 18:48                     ` Cyrill Gorcunov
2011-01-06 21:18 ` [PATCH 6/6] x86, NMI: Clean-up default_do_nmi() Don Zickus
2011-01-07 15:35   ` [tip:perf/core] " tip-bot for Don Zickus
2011-01-07  9:53 ` [PATCH 0/6] x86, NMI: die_notifier and default_do_nmi cleanups Cyrill Gorcunov
2011-01-07  9:55 ` Peter Zijlstra
  -- strict thread matches above, loose matches on Subject: below --
2010-10-16  2:22 [PATCH 1/5] x86, NMI: Add NMI symbol constants and rename memory parity to PCI SERR Don Zickus
2010-10-16 16:36 ` [tip:perf/core] " tip-bot for Huang Ying

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®