[PATCH] watchdog: use time_after_eq() in watchdog_reset()

Stefan Roese sr at denx.de
Thu Apr 15 07:38:21 CEST 2021


On 13.04.21 16:43, Rasmus Villemoes wrote:
> Some boards don't work with the rate-limiting done in the generic
> watchdog_reset() provided by wdt-uclass.
> 
> For example, on powerpc, get_timer() ceases working during bootm since
> interrupts are disabled before the kernel image gets decompressed, and
> when the decompression takes longer than the watchdog device
> allows (or enough of the budget that the kernel doesn't get far enough
> to assume responsibility for petting the watchdog), the result is a
> non-booting board.
> 
> As a somewhat hacky workaround (because DT is supposed to describe
> hardware), allow specifying hw_margin_ms=0 in device tree to
> effectively disable the ratelimiting and actually ping the watchdog
> every time watchdog_reset() is called. For that to work, the "has
> enough time passed" check just needs to be tweaked a little to allow
> the now==next_reset case as well.
> 
> Suggested-by: Christophe Leroy <christophe.leroy at csgroup.eu>
> Signed-off-by: Rasmus Villemoes <rasmus.villemoes at prevas.dk>
> ---
> 
> It's the option I dislike the most (because of the DT abuse), but I
> also do accept that it's the one with the minimal code impact, and
> apparently the path of least resistance. So here it is.

Right. An alternative way would have been to add a new Kconfig symbol
to define the default value of "reset_period" so that it can be
configured to different values via Kconfig as well.

>   drivers/watchdog/wdt-uclass.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/watchdog/wdt-uclass.c b/drivers/watchdog/wdt-uclass.c
> index 0603ffbd36..2687135296 100644
> --- a/drivers/watchdog/wdt-uclass.c
> +++ b/drivers/watchdog/wdt-uclass.c
> @@ -148,7 +148,7 @@ void watchdog_reset(void)
>   
>   	/* Do not reset the watchdog too often */
>   	now = get_timer(0);
> -	if (time_after(now, next_reset)) {
> +	if (time_after_eq(now, next_reset)) {
>   		next_reset = now + reset_period;
>   		wdt_reset(gd->watchdog_dev);
>   	}
> 

Reviewed-by: Stefan Roese <sr at denx.de>

Thanks,
Stefan


More information about the U-Boot mailing list