[PATCH] cyclic: Don't disable cylic function upon exceeding CPU time

Stefan Roese sr at denx.de
Mon Oct 24 13:40:55 CEST 2022


On 17.10.22 09:00, Stefan Roese wrote:
> With the migration of the watchdog infrastructure to cyclic functions
> it's been noticed, that at least one watchdog driver is broken now. As
> the execution time of it's watchdog reset function is quite long.
> 
> In general it's not really necessary (right now) to disable the cyclic
> function upon exceeding CPU time usage. So instead of disabling the
> cylic function in this case, let's just print a warning once to show
> this potential problem to the user.
> 
> Signed-off-by: Stefan Roese <sr at denx.de>
> Suggested-by: Rasmus Villemoes <rasmus.villemoes at prevas.dk>
> Cc: Rasmus Villemoes <rasmus.villemoes at prevas.dk>
> Cc: Tom Rini <trini at konsulko.com>
> Cc: Pali Rohár <pali at kernel.org>

Applied to u-boot-watchdog/master

Thanks,
Stefan

> ---
>   common/cyclic.c  | 12 ++++++++----
>   include/cyclic.h |  2 ++
>   2 files changed, 10 insertions(+), 4 deletions(-)
> 
> diff --git a/common/cyclic.c b/common/cyclic.c
> index b3c180bd1a62..7abb82c16a90 100644
> --- a/common/cyclic.c
> +++ b/common/cyclic.c
> @@ -85,13 +85,17 @@ void cyclic_run(void)
>   			cyclic->cpu_time_us += cpu_time;
>   
>   			/* Check if cpu-time exceeds max allowed time */
> -			if (cpu_time > CONFIG_CYCLIC_MAX_CPU_TIME_US) {
> -				pr_err("cyclic function %s took too long: %lldus vs %dus max, disabling\n",
> +			if ((cpu_time > CONFIG_CYCLIC_MAX_CPU_TIME_US) &&
> +			    (!cyclic->already_warned)) {
> +				pr_err("cyclic function %s took too long: %lldus vs %dus max\n",
>   				       cyclic->name, cpu_time,
>   				       CONFIG_CYCLIC_MAX_CPU_TIME_US);
>   
> -				/* Unregister this cyclic function */
> -				cyclic_unregister(cyclic);
> +				/*
> +				 * Don't disable this function, just warn once
> +				 * about this exceeding CPU time usage
> +				 */
> +				cyclic->already_warned = true;
>   			}
>   		}
>   	}
> diff --git a/include/cyclic.h b/include/cyclic.h
> index 760163643345..9c5c4fcc5468 100644
> --- a/include/cyclic.h
> +++ b/include/cyclic.h
> @@ -39,6 +39,7 @@ struct cyclic_drv {
>    * @run_cnt: Counter of executions occurances
>    * @next_call: Next time in us, when the function shall be executed again
>    * @list: List node
> + * @already_warned: Flag that we've warned about exceeding CPU time usage
>    */
>   struct cyclic_info {
>   	void (*func)(void *ctx);
> @@ -50,6 +51,7 @@ struct cyclic_info {
>   	uint64_t run_cnt;
>   	uint64_t next_call;
>   	struct list_head list;
> +	bool already_warned;
>   };
>   
>   /** Function type for cyclic functions */

Viele Grüße,
Stefan Roese

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de


More information about the U-Boot mailing list