提交 ee89e71e 编写于 作者: U Ulrich Obergfell 提交者: Linus Torvalds

kernel/watchdog.c: avoid race between lockup detector suspend/resume and CPU hotplug

The lockup detector suspend/resume interface that was introduced by
commit 8c073d27 ("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: NUlrich Obergfell <uobergfe@redhat.com>
Acked-by: NDon Zickus <dzickus@redhat.com>
Reviewed-by: NAaron Tomlin <atomlin@redhat.com>
Cc: Ulrich Obergfell <uobergfe@redhat.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 ac1f5912
...@@ -719,6 +719,7 @@ int lockup_detector_suspend(void) ...@@ -719,6 +719,7 @@ int lockup_detector_suspend(void)
{ {
int ret = 0; int ret = 0;
get_online_cpus();
mutex_lock(&watchdog_proc_mutex); mutex_lock(&watchdog_proc_mutex);
/* /*
* Multiple suspend requests can be active in parallel (counted by * Multiple suspend requests can be active in parallel (counted by
...@@ -759,6 +760,7 @@ void lockup_detector_resume(void) ...@@ -759,6 +760,7 @@ void lockup_detector_resume(void)
watchdog_unpark_threads(); watchdog_unpark_threads();
mutex_unlock(&watchdog_proc_mutex); mutex_unlock(&watchdog_proc_mutex);
put_online_cpus();
} }
static int update_watchdog_all_cpus(void) static int update_watchdog_all_cpus(void)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册