printk: add missing memory barrier to wake_up_klogd()
authorJohn Ogness <john.ogness@linutronix.de>
Thu, 21 Apr 2022 21:22:38 +0000 (23:28 +0206)
committerPetr Mladek <pmladek@suse.com>
Fri, 22 Apr 2022 19:30:57 +0000 (21:30 +0200)
commit1f5d783094cf28b4905f51cad846eb5d1db6673e
tree6278632b36d62cc5097d0eb8bc9ebd942294453d
parentf5343321b71ac0a1112adeab0ff90b239bad3a83
printk: add missing memory barrier to wake_up_klogd()

It is important that any new records are visible to preparing
waiters before the waker checks if the wait queue is empty.
Otherwise it is possible that:

- there are new records available
- the waker sees an empty wait queue and does not wake
- the preparing waiter sees no new records and begins to wait

This is exactly the problem that the function description of
waitqueue_active() warns about.

Use wq_has_sleeper() instead of waitqueue_active() because it
includes the necessary full memory barrier.

Signed-off-by: John Ogness <john.ogness@linutronix.de>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
Link: https://lore.kernel.org/r/20220421212250.565456-4-john.ogness@linutronix.de
kernel/printk/printk.c