[PATCH 01/10] rv: Force environment reset action on HA monitor start
From: Gabriele Monaco <gmonaco@redhat.com>
Date: 2026-09-29 12:49:29
Also in:
lkml
Subsystem:
runtime verification (rv), the rest, tracing · Maintainers:
Steven Rostedt, Gabriele Monaco, Linus Torvalds, Masami Hiramatsu
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@redhat.com> --- 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 6e1c7fe5449a..93ac99ff7f1d 100644
--- a/include/rv/ha_monitor.h
+++ b/include/rv/ha_monitor.h@@ -159,19 +159,25 @@ static void ha_monitor_destroy(void) /* Should be supplied by the monitor */ static u64 ha_get_env(struct ha_monitor *ha_mon, enum envs env, u64 time_ns); +static void ha_reset_env(struct ha_monitor *ha_mon, enum envs env, u64 time_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 time_ns) { } +#endif /* * ha_monitor_reset_all_stored - reset all environment variables in the monitor */ static inline void ha_monitor_reset_all_stored(struct ha_monitor *ha_mon) { + u64 time_ns = ha_get_ns(); + for (int i = 0; i < ENV_MAX_STORED; i++) - WRITE_ONCE(ha_mon->env_store[i], ENV_INVALID_VALUE); + ha_reset_env(ha_mon, i, time_ns); } /*
diff --git a/kernel/trace/rv/monitors/opid/opid.h b/kernel/trace/rv/monitors/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 { }; _Static_assert(env_max_stored_opid <= MAX_HA_ENV_LEN, "Not enough slots"); +#define HA_NO_RESET struct automaton_opid { char *state_names[state_max_opid];
diff --git a/tools/verification/rvgen/rvgen/dot2c.py b/tools/verification/rvgen/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) == 0: + buff.append("#define HA_NO_RESET") buff.append("") return buff
--
2.55.0