]> git.baikalelectronics.ru Git - kernel.git/commitdiff
tracing: Add tracing_reset_all_online_cpus_unlocked() function
authorSteven Rostedt (Google) <rostedt@goodmis.org>
Wed, 23 Nov 2022 19:25:57 +0000 (14:25 -0500)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Thu, 24 Nov 2022 00:06:11 +0000 (19:06 -0500)
Currently the tracing_reset_all_online_cpus() requires the
trace_types_lock held. But only one caller of this function actually has
that lock held before calling it, and the other just takes the lock so
that it can call it. More users of this function is needed where the lock
is not held.

Add a tracing_reset_all_online_cpus_unlocked() function for the one use
case that calls it without being held, and also add a lockdep_assert to
make sure it is held when called.

Then have tracing_reset_all_online_cpus() take the lock internally, such
that callers do not need to worry about taking it.

Link: https://lkml.kernel.org/r/20221123192741.658273220@goodmis.org
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Zheng Yejian <zhengyejian1@huawei.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
kernel/trace/trace.c
kernel/trace/trace.h
kernel/trace/trace_events.c
kernel/trace/trace_events_synth.c

index a7fe0e115272e13825713c1ae43656abd9601c21..5cfc95a52bc37876ca4d930e8ff8ecd76c307d68 100644 (file)
@@ -2180,10 +2180,12 @@ void tracing_reset_online_cpus(struct array_buffer *buf)
 }
 
 /* Must have trace_types_lock held */
-void tracing_reset_all_online_cpus(void)
+void tracing_reset_all_online_cpus_unlocked(void)
 {
        struct trace_array *tr;
 
+       lockdep_assert_held(&trace_types_lock);
+
        list_for_each_entry(tr, &ftrace_trace_arrays, list) {
                if (!tr->clear_trace)
                        continue;
@@ -2195,6 +2197,13 @@ void tracing_reset_all_online_cpus(void)
        }
 }
 
+void tracing_reset_all_online_cpus(void)
+{
+       mutex_lock(&trace_types_lock);
+       tracing_reset_all_online_cpus_unlocked();
+       mutex_unlock(&trace_types_lock);
+}
+
 /*
  * The tgid_map array maps from pid to tgid; i.e. the value stored at index i
  * is the tgid last observed corresponding to pid=i.
index 54ee5711c72995c9dd1e926c010d30dd90c38f0c..d42e2450715255dc8a804bcb0e37ebda232095df 100644 (file)
@@ -580,6 +580,7 @@ int tracing_is_enabled(void);
 void tracing_reset_online_cpus(struct array_buffer *buf);
 void tracing_reset_current(int cpu);
 void tracing_reset_all_online_cpus(void);
+void tracing_reset_all_online_cpus_unlocked(void);
 int tracing_open_generic(struct inode *inode, struct file *filp);
 int tracing_open_generic_tr(struct inode *inode, struct file *filp);
 bool tracing_is_disabled(void);
index 0356cae0cf74e79075f607bc841df05568688baa..78cd19e31dba1353a9373f0dcf3ae1c14c1f562a 100644 (file)
@@ -2972,7 +2972,7 @@ static void trace_module_remove_events(struct module *mod)
         * over from this module may be passed to the new module events and
         * unexpected results may occur.
         */
-       tracing_reset_all_online_cpus();
+       tracing_reset_all_online_cpus_unlocked();
 }
 
 static int trace_module_notify(struct notifier_block *self,
index 29fbfb27c2b2cc3582db978da674bdbae379cf24..c3b582d19b620dca92e278e96192de87756bb5e3 100644 (file)
@@ -1425,7 +1425,6 @@ int synth_event_delete(const char *event_name)
        mutex_unlock(&event_mutex);
 
        if (mod) {
-               mutex_lock(&trace_types_lock);
                /*
                 * It is safest to reset the ring buffer if the module
                 * being unloaded registered any events that were
@@ -1437,7 +1436,6 @@ int synth_event_delete(const char *event_name)
                 * occur.
                 */
                tracing_reset_all_online_cpus();
-               mutex_unlock(&trace_types_lock);
        }
 
        return ret;