tracing: Do not synchronize freeing of trigger filter on boot up
authorSteven Rostedt (Google) <rostedt@goodmis.org>
Tue, 13 Dec 2022 22:24:29 +0000 (17:24 -0500)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Wed, 14 Dec 2022 13:50:56 +0000 (08:50 -0500)
If a trigger filter on the kernel command line fails to apply (due to
syntax error), it will be freed. The freeing will call
tracepoint_synchronize_unregister(), but this is not needed during early
boot up, and will even trigger a lockdep splat.

Avoid calling the synchronization function when system_state is
SYSTEM_BOOTING.

Link: https://lore.kernel.org/linux-trace-kernel/20221213172429.7774f4ba@gandalf.local.home
Cc: Andrew Morton <akpm@linux-foundation.org>
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
kernel/trace/trace_events_trigger.c

index 19ce9d2..e535959 100644 (file)
@@ -1085,8 +1085,14 @@ int set_trigger_filter(char *filter_str,
        rcu_assign_pointer(data->filter, filter);
 
        if (tmp) {
-               /* Make sure the call is done with the filter */
-               tracepoint_synchronize_unregister();
+               /*
+                * Make sure the call is done with the filter.
+                * It is possible that a filter could fail at boot up,
+                * and then this path will be called. Avoid the synchronization
+                * in that case.
+                */
+               if (system_state != SYSTEM_BOOTING)
+                       tracepoint_synchronize_unregister();
                free_event_filter(tmp);
        }