Skip to contentSkip to conversation

callchain: Annotate RCU pointer with __rcu

PATCH In review Amol Grover 1 participant 2 messages Jan 30, 2020 – Feb 14, 2020 perf events

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 callchain: Annotate RCU pointer with __rcu

Fixes following instances of sparse error
error: incompatible types in comparison expression
(different address spaces)
kernel/events/callchain.c:66:9: error: incompatible types in comparison kernel/events/callchain.c:96:9: error: incompatible types in comparison kernel/events/callchain.c:161:19: error: incompatible types in comparison

This introduces the following warning kernel/events/callchain.c:65:17: warning: incorrect type in assignment which is fixed as below

callchain_cpus_entries is annotated as an RCU pointer. Hence rcu_dereference_protected or similar RCU API is required to dereference the pointer.

---
v2:
- Squash both the commits into a single one.

 kernel/events/callchain.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/events/callchain.c +3 -2
index c2b41a263166..a672d02a1b3a 100644
@@ -32,7 +32,7 @@ static inline size_t perf_callchain_entry__sizeof(void)
 static DEFINE_PER_CPU(int, callchain_recursion[PERF_NR_CONTEXTS]);
 static atomic_t nr_callchain_events;
 static DEFINE_MUTEX(callchain_mutex);
-static struct callchain_cpus_entries *callchain_cpus_entries;
+static struct callchain_cpus_entries __rcu *callchain_cpus_entries;
 
 
 __weak void perf_callchain_kernel(struct perf_callchain_entry_ctx *entry,
@@ -62,7 +62,8 @@ static void release_callchain_buffers(void)
 {
 	struct callchain_cpus_entries *entries;
 
-	entries = callchain_cpus_entries;
+	entries = rcu_dereference_protected(callchain_cpus_entries,
+					    lockdep_is_held(&callchain_mutex));
 	RCU_INIT_POINTER(callchain_cpus_entries, NULL);
 	call_rcu(&entries->rcu_head, release_callchain_buffers_rcu);
 }
Signature · 1 line
2.24.1
#1 lore raw
Quoted 11 lines · Amol Grover

Fixes following instances of sparse error
error: incompatible types in comparison expression
(different address spaces)
kernel/events/callchain.c:66:9: error: incompatible types in comparison kernel/events/callchain.c:96:9: error: incompatible types in comparison kernel/events/callchain.c:161:19: error: incompatible types in comparison

This introduces the following warning kernel/events/callchain.c:65:17: warning: incorrect type in assignment which is fixed as below

Quoted 5 lines

callchain_cpus_entries is annotated as an RCU pointer. Hence rcu_dereference_protected or similar RCU API is required to dereference the pointer.

Hey Peter,

Can you have a look at this patch as well? I have already done the requested changes.

Thanks
Amol

Quoted 33 lines

---
v2:
- Squash both the commits into a single one.

 kernel/events/callchain.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/events/callchain.c +3 -2
index c2b41a263166..a672d02a1b3a 100644
@@ -32,7 +32,7 @@ static inline size_t perf_callchain_entry__sizeof(void)
 static DEFINE_PER_CPU(int, callchain_recursion[PERF_NR_CONTEXTS]);
 static atomic_t nr_callchain_events;
 static DEFINE_MUTEX(callchain_mutex);
-static struct callchain_cpus_entries *callchain_cpus_entries;
+static struct callchain_cpus_entries __rcu *callchain_cpus_entries;
 
 
 __weak void perf_callchain_kernel(struct perf_callchain_entry_ctx *entry,
@@ -62,7 +62,8 @@ static void release_callchain_buffers(void)
 {
 	struct callchain_cpus_entries *entries;
 
-	entries = callchain_cpus_entries;
+	entries = rcu_dereference_protected(callchain_cpus_entries,
+					    lockdep_is_held(&callchain_mutex));
 	RCU_INIT_POINTER(callchain_cpus_entries, NULL);
 	call_rcu(&entries->rcu_head, release_callchain_buffers_rcu);
 }
Signature · 1 line
2.24.1

_______________________________________________
Linux-kernel-mentees mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees