Skip to contentSkip to conversation

Patch "perf: Fix ring_buffer_attach() RCU sync, again" has been added to the 4.1-stable tree

PATCH [email protected] 1 participant 1 message Jun 26, 2015

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

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

perf: Fix ring_buffer_attach() RCU sync, again

to the 4.1-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:
perf-fix-ring_buffer_attach-rcu-sync-again.patch
and it can be found in the queue-4.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From 2f993cf093643b98477c421fa2b9a98dcc940323 Mon Sep 17 00:00:00 2001

From: Oleg Nesterov <[email protected]>
Date: Sat, 30 May 2015 22:04:25 +0200
Subject: perf: Fix ring_buffer_attach() RCU sync, again

From: Oleg Nesterov <[email protected]>

commit 2f993cf093643b98477c421fa2b9a98dcc940323 upstream.

While looking for other users of get_state/cond_sync. I Found ring_buffer_attach() and it looks obviously buggy?

Don't we need to ensure that we have "synchronize" _between_ list_del() and list_add() ?

IOW. Suppose that ring_buffer_attach() preempts right_after get_state_synchronize_rcu() and gp completes before spin_lock().

In this case cond_synchronize_rcu() does nothing and we reuse ->rb_entry without waiting for gp in between?

It also moves the ->rcu_pending check under "if (rb)", to make it more readable imo.

Cc Alexander Shishkin <[email protected]>
Cc Andrew Morton <[email protected]>
Cc Andy Lutomirski <[email protected]>
Cc Borislav Petkov <[email protected]>
Cc Brian Gerst <[email protected]>
Cc Denys Vlasenko <[email protected]>
Cc H. Peter Anvin <[email protected]>
Cc Linus Torvalds <[email protected]>
Cc Paul E. McKenney <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Thomas Gleixner <[email protected]>
Fixes b69cf53640da ("perf: Fix a race between ring_buffer_detach() and ring_buffer_attach()")
---
 kernel/events/core.c |   14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)
kernel/events/core.c +7 -7
@@ -4331,20 +4331,20 @@ static void ring_buffer_attach(struct pe
 		WARN_ON_ONCE(event->rcu_pending);
 
 		old_rb = event->rb;
-		event->rcu_batches = get_state_synchronize_rcu();
-		event->rcu_pending = 1;
-
 		spin_lock_irqsave(&old_rb->event_lock, flags);
 		list_del_rcu(&event->rb_entry);
 		spin_unlock_irqrestore(&old_rb->event_lock, flags);
-	}
 
-	if (event->rcu_pending && rb) {
-		cond_synchronize_rcu(event->rcu_batches);
-		event->rcu_pending = 0;
+		event->rcu_batches = get_state_synchronize_rcu();
+		event->rcu_pending = 1;
 	}
 
 	if (rb) {
+		if (event->rcu_pending) {
+			cond_synchronize_rcu(event->rcu_batches);
+			event->rcu_pending = 0;
+		}
+
 		spin_lock_irqsave(&rb->event_lock, flags);
 		list_add_rcu(&event->rb_entry, &rb->event_list);
 		spin_unlock_irqrestore(&rb->event_lock, flags);

Patches currently in stable-queue which might be from [email protected] are

queue-4.1/perf-x86-add-more-broadwell-model-numbers.patch queue-4.1/perf-x86-intel-bts-fix-ds-area-sharing-with-x86_pmu-events.patch queue-4.1/perf-fix-ring_buffer_attach-rcu-sync-again.patch queue-4.1/perf-x86-honor-the-architectural-performance-monitoring-version.patch