On Wed, 2026-07-08 at 23:38 +0800, [email protected] wrote:
> From: Wen Yang <[email protected]>
> 
> When env_store is U64_MAX (its initial sentinel value),
> ha_invariant_passed_ns() returns 0 immediately without initializing
> env_store to the current clock.  Subsequent calls to
> ha_check_invariant_ns() then find env_store still at U64_MAX, causing
> the elapsed comparison to wrap and always report the invariant as
> satisfied, silently masking any violations.
> 
> Fix by calling ha_reset_clk_ns() to establish the guard on the first
> invocation instead of returning early.  Apply the same fix to
> ha_invariant_passed_jiffy().
> 
> Signed-off-by: Wen Yang <[email protected]>

While this looks alright, I have something else in mind for the env variables
lifecycle. After [1] is merged, I'd like to merge [2] which is basically
inspired on your idea of resetting variables on start, just it's embedded in the
framework (and requires [1] to get rid of the double representation for env
variables).
This is probably going to happen after the next merge window.

I believe you can keep this patch for now and your model wouldn't need change
after adding [2] instead.

Thoughts?

Thanks,
Gabriele

[1] -
https://lore.kernel.org/lkml/c0f600dcbf3d8b487c944406851a39146f4d91fa.1781847583.git.nam...@linutronix.de/
[2] -
https://web.git.kernel.org/pub/scm/linux/kernel/git/gmonaco/linux.git/commit/?h=rv_hybrid_automata_enq_lark&id=d7c5c40c81d9b928aa9f86c4115429bffd223a8c

> ---
>  include/rv/ha_monitor.h | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/include/rv/ha_monitor.h b/include/rv/ha_monitor.h
> index 83199f90afe8..dddf5694bcc8 100644
> --- a/include/rv/ha_monitor.h
> +++ b/include/rv/ha_monitor.h
> @@ -375,12 +375,12 @@ static inline bool ha_check_invariant_ns(struct
> ha_monitor *ha_mon,
>  static inline u64 ha_invariant_passed_ns(struct ha_monitor *ha_mon, enum envs
> env,
>                                  u64 expire, u64 time_ns)
>  {
> -     u64 passed = 0;
> +     u64 passed;
>  
>       if (env < 0 || env >= ENV_MAX_STORED)
>               return 0;
>       if (ha_monitor_env_invalid(ha_mon, env))
> -             return 0;
> +             ha_reset_clk_ns(ha_mon, env, time_ns);
>       passed = ha_get_env(ha_mon, env, time_ns);
>       ha_set_invariant_ns(ha_mon, env, expire - passed, time_ns);
>       return passed;
> @@ -414,12 +414,12 @@ static inline bool ha_check_invariant_jiffy(struct
> ha_monitor *ha_mon,
>  static inline u64 ha_invariant_passed_jiffy(struct ha_monitor *ha_mon, enum
> envs env,
>                                     u64 expire, u64 time_ns)
>  {
> -     u64 passed = 0;
> +     u64 passed;
>  
>       if (env < 0 || env >= ENV_MAX_STORED)
>               return 0;
>       if (ha_monitor_env_invalid(ha_mon, env))
> -             return 0;
> +             ha_reset_clk_jiffy(ha_mon, env);
>       passed = ha_get_env(ha_mon, env, time_ns);
>       ha_set_invariant_jiffy(ha_mon, env, expire - passed);
>       return passed;


Reply via email to