Re: [PATCH 5/8] watchdog: core: Restore WDOG_HW_RUNNING if stopping watchdog fails
From: Tzung-Bi Shih
Date: Wed Sep 30 2026 - 07:59:27 EST
On Tue, Sep 29, 2026 at 06:46:32AM -0700, Guenter Roeck wrote:
> diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c
> index af756ee228b2..edf2cccd1c0e 100644
> --- a/drivers/watchdog/watchdog_dev.c
> +++ b/drivers/watchdog/watchdog_dev.c
> @@ -324,6 +324,8 @@ static int watchdog_stop(struct watchdog_device *wdd)
> clear_bit(WDOG_ACTIVE, &wdd->status);
> watchdog_update_worker(wdd);
> watchdog_hrtimer_pretimeout_stop(wdd);
> + } else {
> + set_bit(WDOG_HW_RUNNING, &wdd->status);
> }
This makes more sense to me to move into the block introduced by [1].
E.g.,
diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c
index e8c1fcb53c56..4a9c41480fb8 100644
--- a/drivers/watchdog/watchdog_dev.c
+++ b/drivers/watchdog/watchdog_dev.c
@@ -306,7 +306,12 @@ static int watchdog_stop(struct watchdog_device *wdd)
if (wdd->ops->stop) {
clear_bit(WDOG_HW_RUNNING, &wdd->status);
err = wdd->ops->stop(wdd);
- if (err < 0) {
+ if (err == 0) {
+ clear_bit(WDOG_ACTIVE, &wdd->status);
+ watchdog_update_worker(wdd);
+ watchdog_hrtimer_pretimeout_stop(wdd);
+ } else {
+ set_bit(WDOG_HW_RUNNING, &wdd->status);
pr_err("watchdog%d: Failed to stop watchdog: %pe\n",
wdd->id, ERR_PTR(err));
}
@@ -315,12 +320,6 @@ static int watchdog_stop(struct watchdog_device *wdd)
set_bit(WDOG_HW_RUNNING, &wdd->status);
}
- if (err == 0) {
- clear_bit(WDOG_ACTIVE, &wdd->status);
- watchdog_update_worker(wdd);
- watchdog_hrtimer_pretimeout_stop(wdd);
- }
-
return err;
}
[1] https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git/commit/?id=7b08904eb388d942fed86adf4f5edaaed554e814