Patch "perf: Fix ring_buffer_attach() RCU sync, again" has been added to the 4.1-stable tree
Subsystems (2)
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
2f993cf093643b98477c421fa2b9a98dcc940323Mon 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.
--- 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 peWARN_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