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: Ulrich Obergfell <uobergfe@redhat.com>
Reviewed-by: Aaron Tomlin <atomlin@redhat.com>
Acked-by: Don Zickus <dzickus@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>
This commit is contained in:
Ulrich Obergfell 2015-11-05 18:44:33 -08:00 committed by Linus Torvalds
parent 58cf690a09
commit b43cb43cb8
1 changed files with 23 additions and 7 deletions

View File

@ -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)
* 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,
} 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);