Message ID | 20200624114534.1362-2-t-kristo@ti.com |
---|---|
State | Superseded |
Headers | show |
Series | watchdog: rti: adjust initial ping for attach | expand |
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@ti.com> Reviewed-by: Guenter Roeck <linux@roeck-us.net> > --- > 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;
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;
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> --- drivers/watchdog/watchdog_dev.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) -- 2.17.1 -- Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki