diff options
Diffstat (limited to 'kernel/events/core.c')
| -rw-r--r-- | kernel/events/core.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index 9e0773d5d110..f2003b97ddc9 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -4331,20 +4331,20 @@ static void ring_buffer_attach(struct perf_event *event, | |||
| 4331 | WARN_ON_ONCE(event->rcu_pending); | 4331 | WARN_ON_ONCE(event->rcu_pending); |
| 4332 | 4332 | ||
| 4333 | old_rb = event->rb; | 4333 | old_rb = event->rb; |
| 4334 | event->rcu_batches = get_state_synchronize_rcu(); | ||
| 4335 | event->rcu_pending = 1; | ||
| 4336 | |||
| 4337 | spin_lock_irqsave(&old_rb->event_lock, flags); | 4334 | spin_lock_irqsave(&old_rb->event_lock, flags); |
| 4338 | list_del_rcu(&event->rb_entry); | 4335 | list_del_rcu(&event->rb_entry); |
| 4339 | spin_unlock_irqrestore(&old_rb->event_lock, flags); | 4336 | spin_unlock_irqrestore(&old_rb->event_lock, flags); |
| 4340 | } | ||
| 4341 | 4337 | ||
| 4342 | if (event->rcu_pending && rb) { | 4338 | event->rcu_batches = get_state_synchronize_rcu(); |
| 4343 | cond_synchronize_rcu(event->rcu_batches); | 4339 | event->rcu_pending = 1; |
| 4344 | event->rcu_pending = 0; | ||
| 4345 | } | 4340 | } |
| 4346 | 4341 | ||
| 4347 | if (rb) { | 4342 | if (rb) { |
| 4343 | if (event->rcu_pending) { | ||
| 4344 | cond_synchronize_rcu(event->rcu_batches); | ||
| 4345 | event->rcu_pending = 0; | ||
| 4346 | } | ||
| 4347 | |||
| 4348 | spin_lock_irqsave(&rb->event_lock, flags); | 4348 | spin_lock_irqsave(&rb->event_lock, flags); |
| 4349 | list_add_rcu(&event->rb_entry, &rb->event_list); | 4349 | list_add_rcu(&event->rb_entry, &rb->event_list); |
| 4350 | spin_unlock_irqrestore(&rb->event_lock, flags); | 4350 | spin_unlock_irqrestore(&rb->event_lock, flags); |
