Commit b43cb43c authored by Ulrich Obergfell's avatar Ulrich Obergfell Committed by Linus Torvalds

watchdog: implement error handling in update_watchdog_all_cpus() and callers

update_watchdog_all_cpus() now passes errors from watchdog_park_threads()
up to functions in the call chain.  This allows watchdog_enable_all_cpus()
and proc_watchdog_update() to handle such errors too.
Signed-off-by: default avatarUlrich Obergfell <uobergfe@redhat.com>
Reviewed-by: default avatarAaron Tomlin <atomlin@redhat.com>
Acked-by: default avatarDon Zickus <dzickus@redhat.com>
Cc: Ulrich Obergfell <uobergfe@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 58cf690a
...@@ -731,10 +731,17 @@ void lockup_detector_resume(void) ...@@ -731,10 +731,17 @@ void lockup_detector_resume(void)
mutex_unlock(&watchdog_proc_mutex); mutex_unlock(&watchdog_proc_mutex);
} }
static void update_watchdog_all_cpus(void) static int update_watchdog_all_cpus(void)
{ {
watchdog_park_threads(); int ret;
ret = watchdog_park_threads();
if (ret)
return ret;
watchdog_unpark_threads(); watchdog_unpark_threads();
return 0;
} }
static int watchdog_enable_all_cpus(void) static int watchdog_enable_all_cpus(void)
...@@ -753,9 +760,17 @@ static int watchdog_enable_all_cpus(void) ...@@ -753,9 +760,17 @@ static int watchdog_enable_all_cpus(void)
* Enable/disable the lockup detectors or * Enable/disable the lockup detectors or
* change the sample period 'on the fly'. * change the sample period 'on the fly'.
*/ */
update_watchdog_all_cpus(); err = update_watchdog_all_cpus();
if (err) {
watchdog_disable_all_cpus();
pr_err("Failed to update lockup detectors, disabled\n");
}
} }
if (err)
watchdog_enabled = 0;
return err; return err;
} }
...@@ -851,12 +866,13 @@ static int proc_watchdog_common(int which, struct ctl_table *table, int write, ...@@ -851,12 +866,13 @@ static int proc_watchdog_common(int which, struct ctl_table *table, int write,
} while (cmpxchg(&watchdog_enabled, old, new) != old); } while (cmpxchg(&watchdog_enabled, old, new) != old);
/* /*
* Update the run state of the lockup detectors. * Update the run state of the lockup detectors. There is _no_
* Restore 'watchdog_enabled' on failure. * need to check the value returned by proc_watchdog_update()
* and to restore the previous value of 'watchdog_enabled' as
* both lockup detectors are disabled if proc_watchdog_update()
* returns an error.
*/ */
err = proc_watchdog_update(); err = proc_watchdog_update();
if (err)
watchdog_enabled = old;
} }
out: out:
mutex_unlock(&watchdog_proc_mutex); mutex_unlock(&watchdog_proc_mutex);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment