perf_event: Annotate rb pointer with __rcu
PATCH 1/1 perf_event: Annotate rb pointer with __rcu
perf_event::rb is used in RCU context, tell sparse about it aswell to eliminate false-positives.
Fixes the following instances of sparse error:
incompatible types in comparison expression (different address spaces) kernel/events/core.c:5596:9kernel/events/core.c:5302:22kernel/events/core.c:5438:14kernel/events/core.c:5471:14kernel/events/core.c:5528:14kernel/events/core.c:5614:14kernel/events/core.c:5627:14kernel/events/core.c:7182:13 kernel/events/ring_buffer.c:169:14 kernel/events/ring_buffer.c:169:14 kernel/events/ring_buffer.c:169:14
This introduces the following 2 new sparse errors:kernel/events/core.c:7212:9 kernel/events/core.c:5749:31
which are fixed by using RCU primitives, rcu_dereference() and rcu_access_pointer() on perf_event::rb.
--- include/linux/perf_event.h | 2 +- kernel/events/core.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-)
include/linux/perf_event.h +1 -1
@@ -694,7 +694,7 @@ struct perf_event {struct mutex mmap_mutex;atomic_t mmap_count; -struct ring_buffer *rb; +struct ring_buffer __rcu *rb;struct list_head rb_entry;unsigned long rcu_batches;int rcu_pending;
kernel/events/core.c +3 -2
@@ -5746,7 +5746,7 @@ static void perf_mmap_close(struct vm_area_struct *vma)* still restart the iteration to make sure we're not now * iterating the wrong list. */ -if (event->rb == rb) +if (rcu_access_pointer (event->rb) == rb)ring_buffer_attach (event,NULL );mutex_unlock (&event->mmap_mutex);
@@ -7209,7 +7209,8 @@ static void perf_pmu_output_stop(struct perf_event *event) restart:rcu_read_lock (); -list_for_each_entry_rcu (iter, &event->rb->event_list, rb_entry) { +list_for_each_entry_rcu (iter, &rcu_dereference (event->rb)->event_list, + rb_entry) {/* * For per-CPU events, we need to make sure that neither they * nor their children are running; for cpu==-1 events it's
Signature · 1 line
2.24.1