Patch "tracing: Do not free snapshot if tracer is on cmdline" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    tracing: Do not free snapshot if tracer is on cmdline

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     tracing-do-not-free-snapshot-if-tracer-is-on-cmdline.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 6ab66d31addb64dde43b25e9982d488d23cc60c4
Author: Steven Rostedt (Google) <rostedt@xxxxxxxxxxx>
Date:   Wed Oct 5 11:37:57 2022 -0400

    tracing: Do not free snapshot if tracer is on cmdline
    
    [ Upstream commit a541a9559bb0a8ecc434de01d3e4826c32e8bb53 ]
    
    The ftrace_boot_snapshot and alloc_snapshot cmdline options allocate the
    snapshot buffer at boot up for use later. The ftrace_boot_snapshot in
    particular requires the snapshot to be allocated because it will take a
    snapshot at the end of boot up allowing to see the traces that happened
    during boot so that it's not lost when user space takes over.
    
    When a tracer is registered (started) there's a path that checks if it
    requires the snapshot buffer or not, and if it does not and it was
    allocated it will do a synchronization and free the snapshot buffer.
    
    This is only required if the previous tracer was using it for "max
    latency" snapshots, as it needs to make sure all max snapshots are
    complete before freeing. But this is only needed if the previous tracer
    was using the snapshot buffer for latency (like irqoff tracer and
    friends). But it does not make sense to free it, if the previous tracer
    was not using it, and the snapshot was allocated by the cmdline
    parameters. This basically takes away the point of allocating it in the
    first place!
    
    Note, the allocated snapshot worked fine for just trace events, but fails
    when a tracer is enabled on the cmdline.
    
    Further investigation, this goes back even further and it does not require
    a tracer on the cmdline to fail. Simply enable snapshots and then enable a
    tracer, and it will remove the snapshot.
    
    Link: https://lkml.kernel.org/r/20221005113757.041df7fe@xxxxxxxxxxxxxxxxxx
    
    Cc: Masami Hiramatsu <mhiramat@xxxxxxxxxx>
    Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
    Cc: stable@xxxxxxxxxxxxxxx
    Fixes: 45ad21ca5530 ("tracing: Have trace_array keep track if snapshot buffer is allocated")
    Reported-by: Ross Zwisler <zwisler@xxxxxxxxxx>
    Tested-by: Ross Zwisler <zwisler@xxxxxxxxxx>
    Signed-off-by: Steven Rostedt (Google) <rostedt@xxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 21795777587b..24a5ea9a2cc0 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -6399,12 +6399,12 @@ int tracing_set_tracer(struct trace_array *tr, const char *buf)
 	if (tr->current_trace->reset)
 		tr->current_trace->reset(tr);
 
+#ifdef CONFIG_TRACER_MAX_TRACE
+	had_max_tr = tr->current_trace->use_max_tr;
+
 	/* Current trace needs to be nop_trace before synchronize_rcu */
 	tr->current_trace = &nop_trace;
 
-#ifdef CONFIG_TRACER_MAX_TRACE
-	had_max_tr = tr->allocated_snapshot;
-
 	if (had_max_tr && !t->use_max_tr) {
 		/*
 		 * We need to make sure that the update_max_tr sees that
@@ -6417,11 +6417,13 @@ int tracing_set_tracer(struct trace_array *tr, const char *buf)
 		free_snapshot(tr);
 	}
 
-	if (t->use_max_tr && !had_max_tr) {
+	if (t->use_max_tr && !tr->allocated_snapshot) {
 		ret = tracing_alloc_snapshot_instance(tr);
 		if (ret < 0)
 			goto out;
 	}
+#else
+	tr->current_trace = &nop_trace;
 #endif
 
 	if (t->init) {



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux