• Rasmus Villemoes's avatar
    watchdog: change watchdog_need_worker logic · 3fbfe926
    Rasmus Villemoes authored
    If the driver indicates that the watchdog is running, the framework
    should feed it until userspace opens the device, regardless of whether
    the driver has set max_hw_heartbeat_ms.
    
    This patch only affects the case where wdd->max_hw_heartbeat_ms is
    zero, wdd->timeout is non-zero, the watchdog is not active and the
    hardware device is running (*):
    
    - If wdd->timeout is zero, watchdog_need_worker() returns false both
    before and after this patch, and watchdog_next_keepalive() is not
    called.
    
    - If watchdog_active(wdd), the return value from watchdog_need_worker
    is also the same as before (namely, hm && t > hm). Hence in that case,
    watchdog_next_keepalive() is only called if hm == max_hw_heartbeat_ms
    is non-zero, so the change to min_not_zero there is a no-op.
    
    - If the watchdog is not active and the device is not running, we
    return false from watchdog_need_worker just as before.
    
    That leaves the watchdog_hw_running(wdd) && !watchdog_active(wdd) &&
    wdd->timeout case. Again, it's easy to see that if
    wdd->max_hw_heartbeat_ms is non-zero, we return true from
    watchdog_need_worker with and without this patch, and the logic in
    watchdog_next_keepalive is unchanged. Finally, if
    wdd->max_hw_heartbeat_ms is 0, we used to end up in the
    cancel_delayed_work branch, whereas with this patch we end up
    scheduling a ping timeout_ms/2 from now.
    
    (*) This should imply that no current kernel drivers are affected,
    since the only drivers which explicitly set WDOG_HW_RUNNING are
    imx2_wdt.c and dw_wdt.c, both of which also provide a non-zero value
    for max_hw_heartbeat_ms. The watchdog core also sets WDOG_HW_RUNNING,
    but only when the driver doesn't provide ->stop, in which case it
    must, according to Documentation/watchdog/watchdog-kernel-api.txt, set
    max_hw_heartbeat_ms.
    Signed-off-by: default avatarRasmus Villemoes <rasmus.villemoes@prevas.dk>
    Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
    Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
    Signed-off-by: default avatarWim Van Sebroeck <wim@iguana.be>
    3fbfe926
watchdog_dev.c 24 KB