Re: [PATCH 3/3] rv: Add explicit lockdep context for reactors
From: Thomas Weißschuh <hidden>
Date: 2025-10-14 09:46:20
Also in:
lkml
On Tue, Oct 14, 2025 at 09:38:09AM +0200, Nam Cao wrote:
Thomas Weißschuh [off-list ref] writes:quoted
Reactors can be called from any context through tracepoints. When developing reactors care needs to be taken to only call APIs which are safe. As the tracepoints used during testing may not actually be called from restrictive contexts lockdep may not be helpful. Add explicit overrides to help lockdep find invalid code patterns. The usage of LD_WAIT_FREE will trigger lockdep warnings in the panic reactor. These are indeed valid warnings but they are out of scope for RV and will instead be fixed by the printk subsystem. Signed-off-by: Thomas Weißschuh <redacted> ---...quoted
void rv_react(struct rv_monitor *monitor, const char *msg, ...) { + static DEFINE_WAIT_OVERRIDE_MAP(rv_react_map, LD_WAIT_FREE); va_list args; if (!rv_reacting_on() || !monitor->react)@@ -487,7 +489,9 @@ void rv_react(struct rv_monitor *monitor, const char *msg, ...) va_start(args, msg); + lock_map_acquire_try(&rv_react_map); monitor->react(msg, args); + lock_map_release(&rv_react_map); va_end(args); }The reactors are invoked in tracepoints' handlers, thus they must not trigger another tracepoint, otherwise we may be stuck in an infinite loop. (this is why preempt_enable_notrace() exists alongside preempt_enable()).
Sounds reasonable. However today not even the printk reactor satisfies this rule as it transitively calls trace_console().
I'm not familiar with the internal lockdep. But I think these would trigger trace_lock_acquire() and trace_lock_release().
Indeed. Right now no monitor attaches to those tracepoints. We could prevent monitors from attaching to certain "well-known" tracepoints. But then we still need to manually track which those are, which is ugly. Or we move the invocation of the reactor to a workqueue/task_work. Thomas