[PATCH] rv: Force environment reset action on HA monitor start
From: Gabriele Monaco
Date: Mon May 25 2026 - 04:23:25 EST
Currently the monitor variables with a storage (e.g. clocks) are
initialised as invalid, then the first explicit reset() sets them as
valid for constraint. This only adds extra complexity to handle the
invalid case in constraints check.
Apply a reset() by default when starting monitors instead of resetting
to an invalid state. If monitors have no stored variable (hence no reset
function) add a macro HA_NO_RESET to stub it, this is all transparently
handled by rvgen.
The reset() action on ns-granularity clocks needs the (possibly cached)
current time, read it directly there. This might cause a double call to
ktime_get_ns() within the same da_handle_start_run_event() but will
occur only the first time and is harmless.
Signed-off-by: Gabriele Monaco <gmonaco@xxxxxxxxxx>
---
include/rv/ha_monitor.h | 8 +++++++-
kernel/trace/rv/monitors/opid/opid.h | 1 +
tools/verification/rvgen/rvgen/dot2c.py | 2 ++
3 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/include/rv/ha_monitor.h b/include/rv/ha_monitor.h
index c2e200234e67..4fc5dadb4240 100644
--- a/include/rv/ha_monitor.h
+++ b/include/rv/ha_monitor.h
@@ -167,19 +167,25 @@ static void ha_monitor_destroy(void)
=20
/* Should be supplied by the monitor */
static u64 ha_get_env(struct ha_monitor *ha_mon, enum envs env, u64 time_n=
s);
+static void ha_reset_env(struct ha_monitor *ha_mon, enum envs env, u64 tim=
e_ns);
static bool ha_verify_constraint(struct ha_monitor *ha_mon,
enum states curr_state,
enum events event,
enum states next_state,
u64 time_ns);
+#ifdef HA_NO_RESET
+static void ha_reset_env(struct ha_monitor *ha_mon, enum envs env, u64 tim=
e_ns) { }
+#endif
=20
/*
* ha_monitor_reset_all_stored - reset all environment variables in the mo=
nitor
*/
static inline void ha_monitor_reset_all_stored(struct ha_monitor *ha_mon)
{
+ u64 time_ns =3D ha_get_ns();
+
for (int i =3D 0; i < ENV_MAX_STORED; i++)
- WRITE_ONCE(ha_mon->env_store[i], ENV_INVALID_VALUE);
+ ha_reset_env(ha_mon, i, time_ns);
}
=20
/*
diff --git a/kernel/trace/rv/monitors/opid/opid.h b/kernel/trace/rv/monitor=
s/opid/opid.h
index fb0aa4c28aa6..f85b1959c2fb 100644
--- a/kernel/trace/rv/monitors/opid/opid.h
+++ b/kernel/trace/rv/monitors/opid/opid.h
@@ -28,6 +28,7 @@ enum envs_opid {
};
=20
_Static_assert(env_max_stored_opid <=3D MAX_HA_ENV_LEN, "Not enough slots"=
);
+#define HA_NO_RESET
=20
struct automaton_opid {
char *state_names[state_max_opid];
diff --git a/tools/verification/rvgen/rvgen/dot2c.py b/tools/verification/r=
vgen/rvgen/dot2c.py
index 22938ce1bf6c..1532e6b6e199 100644
--- a/tools/verification/rvgen/rvgen/dot2c.py
+++ b/tools/verification/rvgen/rvgen/dot2c.py
@@ -90,6 +90,8 @@ class Dot2c(Automata):
' "Not enough slots");')
if {"ns", "us", "ms", "s"}.intersection(self.env_types.values(=
)):
buff.append("#define HA_CLK_NS")
+ if len(self.env_stored) =3D=3D 0:
+ buff.append("#define HA_NO_RESET")
buff.append("")
return buff
=20
--=20
2.55.0