On Mon 2015-09-28 22:44 +0200, Ulrich Obergfell wrote:
> 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 <uober...@redhat.com>
> ---
>  kernel/watchdog.c | 30 +++++++++++++++++++++++-------
>  1 file changed, 23 insertions(+), 7 deletions(-)
> 
> diff --git a/kernel/watchdog.c b/kernel/watchdog.c
> index eb9527c..457113c 100644
> --- a/kernel/watchdog.c
> +++ b/kernel/watchdog.c
> @@ -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);

Reviewed-by: Aaron Tomlin <atom...@redhat.com>

Attachment: signature.asc
Description: PGP signature

Reply via email to