From: Corey Minyard <minyard@acm.org>
To: Linux Kernel <linux-kernel@vger.kernel.org>
Subject: [PATCH] fix i386 NMI watchdog checking
Date: Thu, 12 Oct 2006 22:22:21 -0500 [thread overview]
Message-ID: <20061013032221.GA10816@localdomain> (raw)
I was having a problem with the NMI testing hanging on an SMP system
in check_nmi_watchdog() when using nmi_watchdog=2. It doesn't seem to
happen on a stock kernel, but I was working on something else and it
triggered this problem.
This patch solves the problem. I'm not sure this is quite the right
solution, but I know that the local_irq_enable() is kind of pointless
here and it seems that having scheduling on while the other CPUs are
locked up with interrupts off is a bad idea. And you can't call
smp_call_function() with interrupts off. But adding the preempt
disable around this operation seems to solve the problem.
Signed-off-by: Corey Minyard <minyard@acm.org>
Index: linux-2.6.18/arch/i386/kernel/nmi.c
===================================================================
--- linux-2.6.18.orig/arch/i386/kernel/nmi.c
+++ linux-2.6.18/arch/i386/kernel/nmi.c
@@ -134,12 +134,18 @@ static int __init check_nmi_watchdog(voi
printk(KERN_INFO "Testing NMI watchdog ... ");
+ /*
+ * We must have preempt off while testing the local APIC
+ * watchdog. If we have an interrupt on this CPU while the
+ * other CPUs are wedged, and that interrupt tries to schedule
+ * (and possibly do an IPC), we would be hung.
+ */
+ preempt_disable();
if (nmi_watchdog == NMI_LOCAL_APIC)
smp_call_function(nmi_cpu_busy, (void *)&endflag, 0, 0);
for_each_possible_cpu(cpu)
prev_nmi_count[cpu] = per_cpu(irq_stat, cpu).__nmi_count;
- local_irq_enable();
mdelay((10*1000)/nmi_hz); // wait 10 ticks
for_each_possible_cpu(cpu) {
@@ -151,6 +157,7 @@ static int __init check_nmi_watchdog(voi
#endif
if (nmi_count(cpu) - prev_nmi_count[cpu] <= 5) {
endflag = 1;
+ preempt_enable();
printk("CPU#%d: NMI appears to be stuck (%d->%d)!\n",
cpu,
prev_nmi_count[cpu],
@@ -162,6 +169,7 @@ static int __init check_nmi_watchdog(voi
}
}
endflag = 1;
+ preempt_enable();
printk("OK.\n");
/* now that we know it works we can reduce NMI frequency to
next reply other threads:[~2006-10-13 3:20 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-10-13 3:22 Corey Minyard [this message]
2006-10-17 1:48 ` [PATCH] fix i386 NMI watchdog checking Steven Rostedt
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=20061013032221.GA10816@localdomain \
--to=minyard@acm.org \
--cc=linux-kernel@vger.kernel.org \
/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