watchdog: implement error handling in update_watchdog_all_cpus() and callers
authorUlrich Obergfell <uobergfe@redhat.com>
Fri, 6 Nov 2015 02:44:33 +0000 (18:44 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 6 Nov 2015 03:34:48 +0000 (19:34 -0800)
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>
kernel/watchdog.c

index f0f8a78512a5a0194853321091572dd506aed205..704f933176668ca2a8f2c89d2870694a71f75eb8 100644 (file)
@@ -731,10 +731,17 @@ void lockup_detector_resume(void)
        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();
+
+       return 0;
 }
 
 static int watchdog_enable_all_cpus(void)
@@ -753,9 +760,17 @@ static int watchdog_enable_all_cpus(void)
                 * Enable/disable the lockup detectors or
                 * 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;
 }
 
@@ -851,12 +866,13 @@ static int proc_watchdog_common(int which, struct ctl_table *table, int write,
                } while (cmpxchg(&watchdog_enabled, old, new) != old);
 
                /*
-                * Update the run state of the lockup detectors.
-                * Restore 'watchdog_enabled' on failure.
+                * Update the run state of the lockup detectors. There is _no_
+                * 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();
-               if (err)
-                       watchdog_enabled = old;
        }
 out:
        mutex_unlock(&watchdog_proc_mutex);
This page took 0.0293 seconds and 5 git commands to generate.