Re: [PATCH v6 1/7] tracing: Add DYNAMIC flag for dynamic events

Masami Hiramatsu
2021-08-18T08:15:25Z

On Mon, 16 Aug 2021 23:42:56 -0400
Steven Rostedt <rostedt@goodmis.org> wrote:

> From: "Steven Rostedt (VMware)" <rostedt@goodmis.org>
>
> To differentiate between static and dynamic events, add a new flag
> DYNAMIC to the event flags that all dynamic events have set. This will
> allow to differentiate when attaching to a dynamic event from a static
> event.
>
> Static events have a mod pointer that references the module they were
> created in (or NULL for core kernel). This can be incremented when the
> event has something attached to it. But there exists no such mechanism for
> dynamic events. This is dangerous as the dynamic events may now disappear
> without the "attachment" knowing that it no longer exists.
>
> To enforce the dynamic flag, change dyn_event_add() to pass the event that
> is being created such that it can set the DYNAMIC flag of the event. This
> helps make sure that no location that creates a dynamic event misses
> setting this flag.
>
> Link: https://lore.kernel.org/linux-trace-devel/20210813004448.51c7de69ce432d338f4d226b@kernel.org/
>

This looks good to me.

Acked-by: Masami Hiramatsu <mhiramat@kernel.org>

Thank you,

> Suggested-by: Masami Hiramatsu <mhiramat@kernel.org>
> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
> ---
> include/linux/trace_events.h | 3 +++
> kernel/trace/trace_dynevent.h | 4 +++-
> kernel/trace/trace_events_synth.c | 2 +-
> kernel/trace/trace_kprobe.c | 4 ++--
> kernel/trace/trace_uprobe.c | 4 ++--
> 5 files changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h
> index ad413b382a3c..53c9dffd87fd 100644
> --- a/include/linux/trace_events.h
> +++ b/include/linux/trace_events.h
> @@ -310,6 +310,7 @@ enum {
> TRACE_EVENT_FL_NO_SET_FILTER_BIT,
> TRACE_EVENT_FL_IGNORE_ENABLE_BIT,
> TRACE_EVENT_FL_TRACEPOINT_BIT,
> + TRACE_EVENT_FL_DYNAMIC_BIT,
> TRACE_EVENT_FL_KPROBE_BIT,
> TRACE_EVENT_FL_UPROBE_BIT,
> };
> @@ -321,6 +322,7 @@ enum {
> * NO_SET_FILTER - Set when filter has error and is to be ignored
> * IGNORE_ENABLE - For trace internal events, do not enable with debugfs file
> * TRACEPOINT - Event is a tracepoint
> + * DYNAMIC - Event is a dynamic event (created at run time)
> * KPROBE - Event is a kprobe
> * UPROBE - Event is a uprobe
> */
> @@ -330,6 +332,7 @@ enum {
> TRACE_EVENT_FL_NO_SET_FILTER = (1 << TRACE_EVENT_FL_NO_SET_FILTER_BIT),
> TRACE_EVENT_FL_IGNORE_ENABLE = (1 << TRACE_EVENT_FL_IGNORE_ENABLE_BIT),
> TRACE_EVENT_FL_TRACEPOINT = (1 << TRACE_EVENT_FL_TRACEPOINT_BIT),
> + TRACE_EVENT_FL_DYNAMIC = (1 << TRACE_EVENT_FL_DYNAMIC_BIT),
> TRACE_EVENT_FL_KPROBE = (1 << TRACE_EVENT_FL_KPROBE_BIT),
> TRACE_EVENT_FL_UPROBE = (1 << TRACE_EVENT_FL_UPROBE_BIT),
> };
> diff --git a/kernel/trace/trace_dynevent.h b/kernel/trace/trace_dynevent.h
> index 7754936b57ee..936477a111d3 100644
> --- a/kernel/trace/trace_dynevent.h
> +++ b/kernel/trace/trace_dynevent.h
> @@ -76,13 +76,15 @@ int dyn_event_init(struct dyn_event *ev, struct dyn_event_operations *ops)
> return 0;
> }
>
> -static inline int dyn_event_add(struct dyn_event *ev)
> +static inline int dyn_event_add(struct dyn_event *ev,
> + struct trace_event_call *call)
> {
> lockdep_assert_held(&event_mutex);
>
> if (!ev || !ev->ops)
> return -EINVAL;
>
> + call->flags |= TRACE_EVENT_FL_DYNAMIC;
> list_add_tail(&ev->list, &dyn_event_list);
> return 0;
> }
> diff --git a/kernel/trace/trace_events_synth.c b/kernel/trace/trace_events_synth.c
> index 9315fc03e303..f4f5489e1e28 100644
> --- a/kernel/trace/trace_events_synth.c
> +++ b/kernel/trace/trace_events_synth.c
> @@ -1298,7 +1298,7 @@ static int __create_synth_event(const char *name, const char *raw_fields)
> }
> ret = register_synth_event(event);
> if (!ret)
> - dyn_event_add(&event->devent);
> + dyn_event_add(&event->devent, &event->call);
> else
> free_synth_event(event);
> out:
> diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
> index ea6178cb5e33..bfef43bfce37 100644
> --- a/kernel/trace/trace_kprobe.c
> +++ b/kernel/trace/trace_kprobe.c
> @@ -618,7 +618,7 @@ static int append_trace_kprobe(struct trace_kprobe *tk, struct trace_kprobe *to)
> if (ret)
> trace_probe_unlink(&tk->tp);
> else
> - dyn_event_add(&tk->devent);
> + dyn_event_add(&tk->devent, trace_probe_event_call(&tk->tp));
>
> return ret;
> }
> @@ -661,7 +661,7 @@ static int register_trace_kprobe(struct trace_kprobe *tk)
> if (ret < 0)
> unregister_kprobe_event(tk);
> else
> - dyn_event_add(&tk->devent);
> + dyn_event_add(&tk->devent, trace_probe_event_call(&tk->tp));
>
> end:
> mutex_unlock(&event_mutex);
> diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c
> index 9b50869a5ddb..50eca53b8d22 100644
> --- a/kernel/trace/trace_uprobe.c
> +++ b/kernel/trace/trace_uprobe.c
> @@ -455,7 +455,7 @@ static int append_trace_uprobe(struct trace_uprobe *tu, struct trace_uprobe *to)
> /* Append to existing event */
> ret = trace_probe_append(&tu->tp, &to->tp);
> if (!ret)
> - dyn_event_add(&tu->devent);
> + dyn_event_add(&tu->devent, trace_probe_event_call(&tu->tp));
>
> return ret;
> }
> @@ -518,7 +518,7 @@ static int register_trace_uprobe(struct trace_uprobe *tu)
> goto end;
> }
>
> - dyn_event_add(&tu->devent);
> + dyn_event_add(&tu->devent, trace_probe_event_call(&tu->tp));
>
> end:
> mutex_unlock(&event_mutex);
> --
> 2.30.2

--
Masami Hiramatsu <mhiramat@kernel.org>