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 <ahalaney@redhat.com>
Closes: https://lore.kernel.org/linux-rt-users/5x4nejpojrtny37k7l6loewqwuaituq77zc3tkkojvawcuvmml@thwg65fdb3vn
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Reviewed-by: John Ogness <john.ogness@linutronix.de>
Signed-off-by: Derek Barbosa <debarbos@redhat.com>
(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 <benjamin.wheeler@canonical.com>
Acked-by: Massimiliano Pellizzer <massimiliano.pellizzer@canonical.com>
Signed-off-by: Kevin Becker <kevin.becker@canonical.com>
This commit is contained in:
Derek Barbosa
2024-11-04 09:29:34 -05:00
committed by Kevin Becker
parent ed00869011
commit c088b62ffa
+1 -7
View File
@@ -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);
}
/**