watchdog: use __watchdog_ping in startup
authorTero Kristo <t-kristo@ti.com>
Fri, 17 Jul 2020 13:29:55 +0000 (16:29 +0300)
committerWim Van Sebroeck <wim@linux-watchdog.org>
Wed, 5 Aug 2020 16:43:02 +0000 (18:43 +0200)
Current watchdog startup functionality does not respect the minimum hw
heartbeat setup and the last watchdog ping timeframe when watchdog is
already running and userspace process attaches to it. Fix this by using
the __watchdog_ping from the startup also. For this code path, we can
also let the __watchdog_ping handle the bookkeeping for the worker and
last keepalive times.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20200717132958.14304-2-t-kristo@ti.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
drivers/watchdog/watchdog_dev.c

index b7d750b24e494bedea3711d76ce5aa5aff753a36..0ad1c393c00e3c7b0de1cd66a481241c148bfc2f 100644 (file)
@@ -275,15 +275,18 @@ static int watchdog_start(struct watchdog_device *wdd)
        set_bit(_WDOG_KEEPALIVE, &wd_data->status);
 
        started_at = ktime_get();
-       if (watchdog_hw_running(wdd) && wdd->ops->ping)
-               err = wdd->ops->ping(wdd);
-       else
+       if (watchdog_hw_running(wdd) && wdd->ops->ping) {
+               err = __watchdog_ping(wdd);
+               if (err == 0)
+                       set_bit(WDOG_ACTIVE, &wdd->status);
+       } else {
                err = wdd->ops->start(wdd);
-       if (err == 0) {
-               set_bit(WDOG_ACTIVE, &wdd->status);
-               wd_data->last_keepalive = started_at;
-               wd_data->last_hw_keepalive = started_at;
-               watchdog_update_worker(wdd);
+               if (err == 0) {
+                       set_bit(WDOG_ACTIVE, &wdd->status);
+                       wd_data->last_keepalive = started_at;
+                       wd_data->last_hw_keepalive = started_at;
+                       watchdog_update_worker(wdd);
+               }
        }
 
        return err;