On Wed, Jun 24, 2020 at 02:45:33PM +0300, Tero Kristo wrote: > 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@xxxxxx> Reviewed-by: Guenter Roeck <linux@xxxxxxxxxxxx> > --- > drivers/watchdog/watchdog_dev.c | 19 +++++++++++-------- > 1 file changed, 11 insertions(+), 8 deletions(-) > > diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c > index 7e4cd34a8c20..bc1cfa288553 100644 > --- a/drivers/watchdog/watchdog_dev.c > +++ b/drivers/watchdog/watchdog_dev.c > @@ -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;