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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Jun 2022 08:22:48 +0000 (10:22 +0200)
commit3b336d607b78427b2710ee17cedf61ef53112be7
tree8788fc0a71668991aaa1917c216de578c9edfc6c
parent195cb7826a477fba62c88680155e25c9df78446d
printk: add missing memory barrier to wake_up_klogd()

[ Upstream commit 1f5d783094cf28b4905f51cad846eb5d1db6673e ]

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
Signed-off-by: Sasha Levin <sashal@kernel.org>
kernel/printk/printk.c