[ 3.5.y.z extended stable ] Patch "tracing: Fix race in snapshot swapping" has been added to staging queue

Luis Henriques luis.henriques at canonical.com
Mon Mar 25 18:00:13 UTC 2013

This is a note to let you know that I have just added a patch titled

    tracing: Fix race in snapshot swapping

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:


If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see



>From dcab0c98c1e76dd3a611d6951271c8234f48d218 Mon Sep 17 00:00:00 2001
From: "Steven Rostedt (Red Hat)" <rostedt at goodmis.org>
Date: Tue, 12 Mar 2013 11:32:32 -0400
Subject: [PATCH] tracing: Fix race in snapshot swapping

commit 2721e72dd10f71a3ba90f59781becf02638aa0d9 upstream.

Although the swap is wrapped with a spin_lock, the assignment
of the temp buffer used to swap is not within that lock.
It needs to be moved into that lock, otherwise two swaps
happening on two different CPUs, can end up using the wrong
temp buffer to assign in the swap.

Luckily, all current callers of the swap function appear to have
their own locks. But in case something is added that allows two
different callers to call the swap, then there's a chance that
this race can trigger and corrupt the buffers.

New code is coming soon that will allow for this race to trigger.

I've Cc'd stable, so this bug will not show up if someone backports
one of the changes that can trigger this bug.

Signed-off-by: Steven Rostedt <rostedt at goodmis.org>
Luis Henriques <luis.henriques at canonical.com>
 kernel/trace/trace.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index a7fa070..bd1df78 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -693,7 +693,7 @@ __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)
 update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)
-	struct ring_buffer *buf = tr->buffer;
+	struct ring_buffer *buf;

 	if (trace_stop_count)
@@ -705,6 +705,7 @@ update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)

+	buf = tr->buffer;
 	tr->buffer = max_tr.buffer;
 	max_tr.buffer = buf;


More information about the kernel-team mailing list