]> git.baikalelectronics.ru Git - kernel.git/commitdiff
tracing: Add DYNAMIC flag for dynamic events
authorSteven Rostedt (VMware) <rostedt@goodmis.org>
Tue, 17 Aug 2021 03:42:56 +0000 (23:42 -0400)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Wed, 18 Aug 2021 22:10:32 +0000 (18:10 -0400)
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/
Link: https://lkml.kernel.org/r/20210817035026.936958254@goodmis.org
Suggested-by: Masami Hiramatsu <mhiramat@kernel.org>
Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
include/linux/trace_events.h
kernel/trace/trace_dynevent.h
kernel/trace/trace_events_synth.c
kernel/trace/trace_kprobe.c
kernel/trace/trace_uprobe.c

index ad413b382a3cab47a38263c3be6cd5c1a6ade72e..53c9dffd87fd220d3a833659162837fa5dcf151c 100644 (file)
@@ -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),
 };
index 7754936b57ee0beaa32ea38dd74f685f51e5b1c8..936477a111d3e7d2cc47caf631d9de434e636cad 100644 (file)
@@ -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;
 }
index 9315fc03e3030b6f5a4a922c445375893b0175ba..f4f5489e1e285a7d6192a4a6325a0659a9f043b1 100644 (file)
@@ -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:
index ea6178cb5e334dbd346519f5405b0a0dc671dd79..bfef43bfce37d15bc7bfd3e743d6a41b0ff3d8f3 100644 (file)
@@ -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);
index 9b50869a5ddb5dc51ca9ebe12e33ac3a1e22fe7f..50eca53b8d22c825cd787dec508c8b1928a32d94 100644 (file)
@@ -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);