Revert x86: fix NMI watchdog 'stopped time' problem
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
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