From c088b62ffae75eedf15da851f33fa86cdd1b39ce Mon Sep 17 00:00:00 2001 From: Derek Barbosa Date: Mon, 4 Nov 2024 09:29:34 -0500 Subject: [PATCH] printk: nbcon: Fix illegal RCU usage on thread wakeup BugLink: https://bugs.launchpad.net/bugs/2102249 In debug kernels, printk'ing during the SMP startup of a secondary CPU results in a splat on boot that details illegal RCU usage from offline CPUs. This patch aligns rcuwait_has_sleeper() with what currently exists in Torvalds' tree, at commit 76f258bf3f2aa, and will avoid the aforementioned splat. Furthermore, this patch makes it so that we avoid the use of hacky rcu_derefrencing through the waiter's task struct,and instead leverages the correct RCU API with the rcuwait_active() function. Reported-by: Andrew Halaney Closes: https://lore.kernel.org/linux-rt-users/5x4nejpojrtny37k7l6loewqwuaituq77zc3tkkojvawcuvmml@thwg65fdb3vn Reviewed-by: Sebastian Andrzej Siewior Reviewed-by: John Ogness Signed-off-by: Derek Barbosa (cherry picked from PREEMPT_RT 6.6.78-rt51) Link: https://lore.kernel.org/all/ZxZ5WXV6umbL9XG9@debarbos-thinkpadt14sgen2i.remote.csb/T/ Acked-by: Benjamin Wheeler Acked-by: Massimiliano Pellizzer Signed-off-by: Kevin Becker --- kernel/printk/nbcon.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/kernel/printk/nbcon.c b/kernel/printk/nbcon.c index b7a4d3be65a5..80c1d408d8ad 100644 --- a/kernel/printk/nbcon.c +++ b/kernel/printk/nbcon.c @@ -1137,9 +1137,6 @@ static void nbcon_irq_work(struct irq_work *irq_work) static inline bool rcuwait_has_sleeper(struct rcuwait *w) { - bool has_sleeper; - - rcu_read_lock(); /* * Guarantee any new records can be seen by tasks preparing to wait * before this context checks if the rcuwait is empty. @@ -1152,10 +1149,7 @@ static inline bool rcuwait_has_sleeper(struct rcuwait *w) * This pairs with nbcon_kthread_func:A. */ smp_mb(); /* LMM(rcuwait_has_sleeper:A) */ - has_sleeper = !!rcu_dereference(w->task); - rcu_read_unlock(); - - return has_sleeper; + return rcuwait_active(w); } /**