On Fri, Jul 19, 2024 at 10:32:32AM GMT, John Ogness wrote: > On 2024-07-18, Andrew Halaney <ahalaney@xxxxxxxxxx> wrote: > > [ 5.061942] ============================= > > [ 5.061942] WARNING: suspicious RCU usage > > [ 5.061942] 5.14.0-467.el9.x86_64+debug #1 Not tainted > > [ 5.061942] ----------------------------- > > [ 5.061942] kernel/printk/nbcon.c:1118 suspicious rcu_dereference_check() usage! > > In Petr Mladek's review of my latest printk-threading series, he pointed > out [0] that I was using the wrong RCU API in rcuwait_has_sleeper(). > > The patch below was his suggestion, which I was already folding into the > next version of my series. > > John Ogness > > [0] https://lore.kernel.org/lkml/ZmsLcu2tHmCfLiu0@xxxxxxxxxxxxxxx > > diff --git a/kernel/printk/nbcon.c b/kernel/printk/nbcon.c > index 0951c2c7fb1b..da462661876c 100644 > --- a/kernel/printk/nbcon.c > +++ b/kernel/printk/nbcon.c > @@ -1181,9 +1181,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. > @@ -1196,10 +1193,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); > } > > /** > Nice, TIL about that. That seems like a good change to me, and prevents the RCU splat from nbcon. Thanks, Andrew