Thread (106 messages) 106 messages, 7 authors, 2026-08-30

Re: [PATCH v19 34/40] rcu/update: fix same dept key collision between various types of RCU

From: Byungchul Park <byungchul@sk.com>
Date: 2026-07-10 06:21:04
Also in: dri-devel, linux-ide, linux-rt-devel, lkml, sashiko-reviews

On Tue, Jul 07, 2026 at 07:33:52AM +0000, sashiko-bot@kernel.org wrote:
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] Unused struct member `dkey` inflates stack footprint
--

commit de6aa9797881496b4a8d7d66626b1bfd19cfdd54
Author: Yunseong Kim [off-list ref]

rcu/update: fix same dept key collision between various types of RCU

This commit addresses a false positive circular dependency report in dept
by assigning separate dept keys and maps to each struct rcu_synchronize
execution context.
quoted
diff --git a/include/linux/rcupdate_wait.h b/include/linux/rcupdate_wait.h
--- a/include/linux/rcupdate_wait.h
+++ b/include/linux/rcupdate_wait.h
@@ -19,17 +19,20 @@ struct rcu_synchronize {

      /* This is for debugging. */
      struct rcu_gp_oldstate oldstate;
+     struct dept_map dmap;
+     struct dept_key dkey;
[Severity: Low]
Does this code ever use the dkey member of struct rcu_synchronize?

The _wait_rcu_gp() macro defines its own static struct dept_key __key,
which it passes as an argument to __wait_rcu_gp(). This leaves the dkey
member of struct rcu_synchronize completely unused and uninitialized, while
needlessly increasing the stack footprint of the rs_array allocated in the
macro.
I will fix it.

	Byungchul
quoted
 };
 void wakeme_after_rcu(struct rcu_head *head);

 void __wait_rcu_gp(bool checktiny, unsigned int state, int n, call_rcu_func_t *crcu_array,
-                struct rcu_synchronize *rs_array);
+                struct rcu_synchronize *rs_array, struct dept_key *dkey);

 #define _wait_rcu_gp(checktiny, state, ...) \
-do {                                                                                         \
-     call_rcu_func_t __crcu_array[] = { __VA_ARGS__ };                                       \
-     struct rcu_synchronize __rs_array[ARRAY_SIZE(__crcu_array)];                            \
-     __wait_rcu_gp(checktiny, state, ARRAY_SIZE(__crcu_array), __crcu_array, __rs_array);    \
+do {                                                                                                 \
+     call_rcu_func_t __crcu_array[] = { __VA_ARGS__ };                                               \
+     static struct dept_key __key;                                                                   \
+     struct rcu_synchronize __rs_array[ARRAY_SIZE(__crcu_array)];                                    \
+     __wait_rcu_gp(checktiny, state, ARRAY_SIZE(__crcu_array), __crcu_array, __rs_array, &__key);    \
 } while (0)
[ ... ]
quoted
diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c
--- a/kernel/rcu/update.c
+++ b/kernel/rcu/update.c
[ ... ]
quoted
@@ -426,7 +426,8 @@ void __wait_rcu_gp(bool checktiny, unsigned int state, int n, call_rcu_func_t *c
                              break;
              if (j == i) {
                      init_rcu_head_on_stack(&rs_array[i].head);
-                     init_completion(&rs_array[i].completion);
+                     sdt_map_init_key(&rs_array[i].dmap, dkey);
+                     init_completion_dmap(&rs_array[i].completion, &rs_array[i].dmap);
                      (crcu_array[i])(&rs_array[i].head, wakeme_after_rcu);
              }
      }
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260706061928.66713-1-byungchul@sk.com?part=34
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help