Revert x86: fix NMI watchdog 'stopped time' problem

2008-01-22 Thread Linux Kernel Mailing List
Gitweb: 
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=4960c9df1407c2723459c60ff13e6efe0c209c62
Commit: 4960c9df1407c2723459c60ff13e6efe0c209c62
Parent: d384e35a25445bb60457b7dab8cffe178c6b7ecb
Author: Thomas Gleixner [EMAIL PROTECTED]
AuthorDate: Tue Jan 22 10:23:01 2008 +0100
Committer:  Thomas Gleixner [EMAIL PROTECTED]
CommitDate: Tue Jan 22 10:23:01 2008 +0100

Revert x86: fix NMI watchdog  'stopped time' problem

This reverts commit d4d25deca49ec2527a634557bf5a6cf449f85deb.

It tried to fix long standing bugzilla entries, but the solution was
reported to break other systems. The reporter of

http://bugzilla.kernel.org/show_bug.cgi?id=9791

tracked it down to this commit and confirmed that reverting the patch
restores the correct behaviour. It's too late in the release cycle to
find a better solution than reverting the commit to avoid regressions.

Signed-off-by: Thomas Gleixner [EMAIL PROTECTED]
Acked-by: Ingo Molnar [EMAIL PROTECTED]
---
 arch/x86/kernel/io_apic_32.c |   12 ++--
 arch/x86/kernel/nmi_32.c |9 ++---
 2 files changed, 4 insertions(+), 17 deletions(-)

diff --git a/arch/x86/kernel/io_apic_32.c b/arch/x86/kernel/io_apic_32.c
index c3a565b..a6b1490 100644
--- a/arch/x86/kernel/io_apic_32.c
+++ b/arch/x86/kernel/io_apic_32.c
@@ -2169,14 +2169,10 @@ static inline void __init check_timer(void)
 {
int apic1, pin1, apic2, pin2;
int vector;
-   unsigned int ver;
unsigned long flags;
 
local_irq_save(flags);
 
-   ver = apic_read(APIC_LVR);
-   ver = GET_APIC_VERSION(ver);
-
/*
 * get/set the timer IRQ vector:
 */
@@ -2189,15 +2185,11 @@ static inline void __init check_timer(void)
 * mode for the 8259A whenever interrupts are routed
 * through I/O APICs.  Also IRQ0 has to be enabled in
 * the 8259A which implies the virtual wire has to be
-* disabled in the local APIC.  Finally timer interrupts
-* need to be acknowledged manually in the 8259A for
-* timer_interrupt() and for the i82489DX when using
-* the NMI watchdog.
+* disabled in the local APIC.
 */
apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
init_8259A(1);
-   timer_ack = !cpu_has_tsc;
-   timer_ack |= (nmi_watchdog == NMI_IO_APIC  !APIC_INTEGRATED(ver));
+   timer_ack = 1;
if (timer_over_8254  0)
enable_8259A_irq(0);
 
diff --git a/arch/x86/kernel/nmi_32.c b/arch/x86/kernel/nmi_32.c
index 80ca72e..852db29 100644
--- a/arch/x86/kernel/nmi_32.c
+++ b/arch/x86/kernel/nmi_32.c
@@ -25,7 +25,6 @@
 
 #include asm/smp.h
 #include asm/nmi.h
-#include asm/timer.h
 
 #include mach_traps.h
 
@@ -84,7 +83,7 @@ static int __init check_nmi_watchdog(void)
 
prev_nmi_count = kmalloc(NR_CPUS * sizeof(int), GFP_KERNEL);
if (!prev_nmi_count)
-   goto error;
+   return -1;
 
printk(KERN_INFO Testing NMI watchdog ... );
 
@@ -119,7 +118,7 @@ static int __init check_nmi_watchdog(void)
if (!atomic_read(nmi_active)) {
kfree(prev_nmi_count);
atomic_set(nmi_active, -1);
-   goto error;
+   return -1;
}
printk(OK.\n);
 
@@ -130,10 +129,6 @@ static int __init check_nmi_watchdog(void)
 
kfree(prev_nmi_count);
return 0;
-error:
-   timer_ack = !cpu_has_tsc;
-
-   return -1;
 }
 /* This needs to happen later in boot so counters are working */
 late_initcall(check_nmi_watchdog);
-
To unsubscribe from this list: send the line unsubscribe git-commits-head in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


x86: fix NMI watchdog 'stopped time' problem

2007-11-26 Thread Linux Kernel Mailing List
Gitweb: 
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=d4d25deca49ec2527a634557bf5a6cf449f85deb
Commit: d4d25deca49ec2527a634557bf5a6cf449f85deb
Parent: 2ffbb8377c7a0713baf6644e285adc27a5654582
Author: Maciej W. Rozycki [EMAIL PROTECTED]
AuthorDate: Mon Nov 26 20:42:19 2007 +0100
Committer:  Ingo Molnar [EMAIL PROTECTED]
CommitDate: Mon Nov 26 20:42:19 2007 +0100

x86: fix NMI watchdog  'stopped time' problem

More than 3 years ago Niclas Gustafsson reported a 'stopped time'
problem:

 Watching the /proc/interrupts with 10s apart after the stop.

 [EMAIL PROTECTED] root]# more /proc/interrupts
CPU0
   0:   66413955  local-APIC-edge  timer
[...]
 LOC:   67355837
 ERR:  0
 MIS:  0
 [EMAIL PROTECTED] root]# more /proc/interrupts
CPU0
   0:   66413955  local-APIC-edge  timer
[...]
 LOC:   67379568
 ERR:  0
 MIS:  0

This may be because buggy SMM firmware messes with the 8259A (configured
for a transparent mode -- yes that rare local-APIC-edge mode is tricky
;-) ) insanely.

this should resolve:

  http://bugzilla.kernel.org/show_bug.cgi?id=2544
  http://bugzilla.kernel.org/show_bug.cgi?id=6296

Patch-dusted-off-by: Ingo Molnar [EMAIL PROTECTED]
Signed-off-by: Ingo Molnar [EMAIL PROTECTED]
Signed-off-by: Thomas Gleixner [EMAIL PROTECTED]
---
 arch/x86/kernel/io_apic_32.c |   12 ++--
 arch/x86/kernel/nmi_32.c |9 +++--
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kernel/io_apic_32.c b/arch/x86/kernel/io_apic_32.c
index f35c6eb..fc4bbc1 100644
--- a/arch/x86/kernel/io_apic_32.c
+++ b/arch/x86/kernel/io_apic_32.c
@@ -2166,6 +2166,10 @@ static inline void __init check_timer(void)
 {
int apic1, pin1, apic2, pin2;
int vector;
+   unsigned int ver;
+
+   ver = apic_read(APIC_LVR);
+   ver = GET_APIC_VERSION(ver);
 
/*
 * get/set the timer IRQ vector:
@@ -2179,11 +2183,15 @@ static inline void __init check_timer(void)
 * mode for the 8259A whenever interrupts are routed
 * through I/O APICs.  Also IRQ0 has to be enabled in
 * the 8259A which implies the virtual wire has to be
-* disabled in the local APIC.
+* disabled in the local APIC.  Finally timer interrupts
+* need to be acknowledged manually in the 8259A for
+* timer_interrupt() and for the i82489DX when using
+* the NMI watchdog.
 */
apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
init_8259A(1);
-   timer_ack = 1;
+   timer_ack = !cpu_has_tsc;
+   timer_ack |= (nmi_watchdog == NMI_IO_APIC  !APIC_INTEGRATED(ver));
if (timer_over_8254  0)
enable_8259A_irq(0);
 
diff --git a/arch/x86/kernel/nmi_32.c b/arch/x86/kernel/nmi_32.c
index 600fd40..f5cc47c 100644
--- a/arch/x86/kernel/nmi_32.c
+++ b/arch/x86/kernel/nmi_32.c
@@ -25,6 +25,7 @@
 
 #include asm/smp.h
 #include asm/nmi.h
+#include asm/timer.h
 
 #include mach_traps.h
 
@@ -83,7 +84,7 @@ static int __init check_nmi_watchdog(void)
 
prev_nmi_count = kmalloc(NR_CPUS * sizeof(int), GFP_KERNEL);
if (!prev_nmi_count)
-   return -1;
+   goto error;
 
printk(KERN_INFO Testing NMI watchdog ... );
 
@@ -117,7 +118,7 @@ static int __init check_nmi_watchdog(void)
if (!atomic_read(nmi_active)) {
kfree(prev_nmi_count);
atomic_set(nmi_active, -1);
-   return -1;
+   goto error;
}
printk(OK.\n);
 
@@ -128,6 +129,10 @@ static int __init check_nmi_watchdog(void)
 
kfree(prev_nmi_count);
return 0;
+error:
+   timer_ack = !cpu_has_tsc;
+
+   return -1;
 }
 /* This needs to happen later in boot so counters are working */
 late_initcall(check_nmi_watchdog);
-
To unsubscribe from this list: send the line unsubscribe git-commits-head in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html