summaryrefslogtreecommitdiffstats
path: root/kernel/watchdog.c
diff options
context:
space:
mode:
authorUlrich Obergfell <uobergfe@redhat.com>2015-11-05 21:44:47 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2015-11-05 22:34:48 -0500
commitee89e71eb091d3ef8ca2be8bd4ec77ccfa91334c (patch)
tree27ad57517e385733fb6ef9e52ef012d77e9ba623 /kernel/watchdog.c
parentac1f591249d95372f3a5ab3828d4af5dfbf5efd3 (diff)
kernel/watchdog.c: avoid race between lockup detector suspend/resume and CPU hotplug
The lockup detector suspend/resume interface that was introduced by commit 8c073d27d7ad ("watchdog: introduce watchdog_suspend() and watchdog_resume()") does not protect itself against races with CPU hotplug. Hence, theoretically it is possible that a new watchdog thread is started on a hotplugged CPU while the lockup detector is suspended, and the thread could thus interfere unexpectedly with the code that requested to suspend the lockup detector. Avoid the race by calling get_online_cpus() in lockup_detector_suspend() put_online_cpus() in lockup_detector_resume() Signed-off-by: Ulrich Obergfell <uobergfe@redhat.com> Acked-by: Don Zickus <dzickus@redhat.com> Reviewed-by: Aaron Tomlin <atomlin@redhat.com> Cc: Ulrich Obergfell <uobergfe@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/watchdog.c')
-rw-r--r--kernel/watchdog.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/kernel/watchdog.c b/kernel/watchdog.c
index 0a23125369f1..7357842da933 100644
--- a/kernel/watchdog.c
+++ b/kernel/watchdog.c
@@ -719,6 +719,7 @@ int lockup_detector_suspend(void)
719{ 719{
720 int ret = 0; 720 int ret = 0;
721 721
722 get_online_cpus();
722 mutex_lock(&watchdog_proc_mutex); 723 mutex_lock(&watchdog_proc_mutex);
723 /* 724 /*
724 * Multiple suspend requests can be active in parallel (counted by 725 * Multiple suspend requests can be active in parallel (counted by
@@ -759,6 +760,7 @@ void lockup_detector_resume(void)
759 watchdog_unpark_threads(); 760 watchdog_unpark_threads();
760 761
761 mutex_unlock(&watchdog_proc_mutex); 762 mutex_unlock(&watchdog_proc_mutex);
763 put_online_cpus();
762} 764}
763 765
764static int update_watchdog_all_cpus(void) 766static int update_watchdog_all_cpus(void)