summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHillf Danton <dhillf@gmail.com>2011-04-28 00:26:55 +0200
committerLinus Torvalds <torvalds@linux-foundation.org>2011-04-28 20:28:21 +0200
commit1409f141ac719b994d2832911b1e9ec928943fc2 (patch)
tree2ef8c9431f15cae6f243482cbe1cf9f11ae60082
parentum: adjust current_thread_info() for newer gcc versions (diff)
downloadlinux-1409f141ac719b994d2832911b1e9ec928943fc2.tar.xz
linux-1409f141ac719b994d2832911b1e9ec928943fc2.zip
kernel/watchdog.c: disable nmi perf event in the error path of enabling watchdog
In corner cases where softlockup watchdog is not setup successfully, the relevant nmi perf event for hardlockup watchdog could be disabled, then the status of the underlying hardware remains unchanged. Also, if the kthread doesn't start then the hrtimer won't run and the hardlockup detector will falsely fire. Signed-off-by: Hillf Danton <dhillf@gmail.com> Signed-off-by: Don Zickus <dzickus@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--kernel/watchdog.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/kernel/watchdog.c b/kernel/watchdog.c
index 140dce750450..14733d4d156b 100644
--- a/kernel/watchdog.c
+++ b/kernel/watchdog.c
@@ -430,9 +430,12 @@ static int watchdog_enable(int cpu)
p = kthread_create(watchdog, (void *)(unsigned long)cpu, "watchdog/%d", cpu);
if (IS_ERR(p)) {
printk(KERN_ERR "softlockup watchdog for %i failed\n", cpu);
- if (!err)
+ if (!err) {
/* if hardlockup hasn't already set this */
err = PTR_ERR(p);
+ /* and disable the perf event */
+ watchdog_nmi_disable(cpu);
+ }
goto out;
}
kthread_bind(p, cpu);