Subject: printk: Enhance the condition check of msleep in pr_flush() From: Chao Qin <[email protected]> Date: Mon Jul 19 10:26:50 2021 +0800 From: Chao Qin <[email protected]> There is msleep in pr_flush(). If call WARN() in the early boot stage such as in early_initcall, pr_flush() will run into msleep when process scheduler is not ready yet. And then the system will sleep forever. Before the system_state is SYSTEM_RUNNING, make sure DO NOT sleep in pr_flush(). Fixes: c0b395bd0fe3("printk: add pr_flush()") Signed-off-by: Chao Qin <[email protected]> Signed-off-by: Lili Li <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]> Reviewed-by: John Ogness <[email protected]> Signed-off-by: John Ogness <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]> Link: https://lore.kernel.org/lkml/[email protected] --- kernel/printk/printk.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) --- @ kernel/printk/printk.c:3652 @ bool pr_flush(int timeout_ms, bool reset u64 diff; u64 seq; - may_sleep = (preemptible() && !in_softirq()); + may_sleep = (preemptible() && + !in_softirq() && + system_state >= SYSTEM_RUNNING); seq = prb_next_seq(prb);