mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-08-25 23:04:54 +00:00
tracing: Ensure module defining synth event cannot be unloaded while tracing
Currently, using synth_event_delete() will fail if the event is being
used (tracing in progress), but that is normally done in the module exit
function. At that stage, failing is problematic as returning a non-zero
status means the module will become locked (impossible to unload or
reload again).
Instead, ensure the module exit function does not get called in the
first place by increasing the module refcnt when the event is enabled.
Cc: stable@vger.kernel.org
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fixes: 35ca5207c2
("tracing: Add synthetic event command generation functions")
Link: https://lore.kernel.org/20250318180906.226841-1-douglas.raillard@arm.com
Signed-off-by: Douglas Raillard <douglas.raillard@arm.com>
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
This commit is contained in:
parent
0c588ac0ca
commit
21581dd4e7
@ -852,6 +852,34 @@ static struct trace_event_fields synth_event_fields_array[] = {
|
||||
{}
|
||||
};
|
||||
|
||||
static int synth_event_reg(struct trace_event_call *call,
|
||||
enum trace_reg type, void *data)
|
||||
{
|
||||
struct synth_event *event = container_of(call, struct synth_event, call);
|
||||
|
||||
switch (type) {
|
||||
case TRACE_REG_REGISTER:
|
||||
case TRACE_REG_PERF_REGISTER:
|
||||
if (!try_module_get(event->mod))
|
||||
return -EBUSY;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
int ret = trace_event_reg(call, type, data);
|
||||
|
||||
switch (type) {
|
||||
case TRACE_REG_UNREGISTER:
|
||||
case TRACE_REG_PERF_UNREGISTER:
|
||||
module_put(event->mod);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int register_synth_event(struct synth_event *event)
|
||||
{
|
||||
struct trace_event_call *call = &event->call;
|
||||
@ -881,7 +909,7 @@ static int register_synth_event(struct synth_event *event)
|
||||
goto out;
|
||||
}
|
||||
call->flags = TRACE_EVENT_FL_TRACEPOINT;
|
||||
call->class->reg = trace_event_reg;
|
||||
call->class->reg = synth_event_reg;
|
||||
call->class->probe = trace_event_raw_event_synth;
|
||||
call->data = event;
|
||||
call->tp = event->tp;
|
||||
|
Loading…
Reference in New Issue
Block a user