Re: [PATCH v2] tracing: Fix event probe removal from dynamic events

From: Masami Hiramatsu
Date: Tue Oct 12 2021 - 18:46:17 EST


On Tue, 12 Oct 2021 08:19:25 -0400
Steven Rostedt <rostedt@xxxxxxxxxxx> wrote:

> From: "Steven Rostedt (VMware)" <rostedt@xxxxxxxxxxx>
>
> When an event probe is to be removed via the API to remove dynamic events,
> an -EBUSY error is returned.
>
> This is because the removal of the event probe does not expect to see the
> event system and name that the event probe is attached to, even though
> that's part of the API to create it. As the removal of probes is to use
> the same API as they are created, fix it by first testing if the first
> parameter of the event probe to be removed matches the system and event
> that the probe is attached to, and then adjust the argc and argv of the
> parameters to match the rest of the syntax.
>
> Link: https://lkml.kernel.org/r/20211011211105.48b6a5fd@xxxxxxxxxxxxxxxx
>
> Fixes: 7491e2c442781 ("tracing: Add a probe that attaches to trace events")
> Signed-off-by: Steven Rostedt (VMware) <rostedt@xxxxxxxxxxx>
> ---
> Changes since v1:
> - amended the commit with the definition of "slash"
>
> kernel/trace/trace_eprobe.c | 20 ++++++++++++++++++++
> 1 file changed, 20 insertions(+)
>
> diff --git a/kernel/trace/trace_eprobe.c b/kernel/trace/trace_eprobe.c
> index 570d081929fb..2bcfa8da5cef 100644
> --- a/kernel/trace/trace_eprobe.c
> +++ b/kernel/trace/trace_eprobe.c
> @@ -119,6 +119,26 @@ static bool eprobe_dyn_event_match(const char *system, const char *event,
> int argc, const char **argv, struct dyn_event *ev)
> {
> struct trace_eprobe *ep = to_trace_eprobe(ev);
> + const char *slash;
> +
> + /* First argument is the system/event the probe is attached to */
> +
> + if (argc < 1)
> + return false;

The first argument check should be optional. If the event name matches and
the system name is NULL but argc == 0, it should return true.
(please consider it is a wild card like "-:*/EVENT *")
So if the argc == 0 please skip below and check the event name and
the system name.

Thank you,

> +
> + slash = strchr(argv[0], '/');
> + if (!slash)
> + slash = strchr(argv[0], '.');
> + if (!slash)
> + return false;
> +
> + if (strncmp(ep->event_system, argv[0], slash - argv[0]))
> + return false;
> + if (strcmp(ep->event_name, slash + 1))
> + return false;
> +
> + argc--;
> + argv++;
>
> return strcmp(trace_probe_name(&ep->tp), event) == 0 &&
> (!system || strcmp(trace_probe_group_name(&ep->tp), system) == 0) &&
> --
> 2.31.1
>


--
Masami Hiramatsu <mhiramat@xxxxxxxxxx>