Re: [PATCH 2/2] printk: wake up klogd in vprintk_emit

From: Steven Rostedt
Date: Wed Apr 18 2018 - 10:30:02 EST


On Sat, 14 Apr 2018 12:01:45 +0900
Sergey Senozhatsky <sergey.senozhatsky@xxxxxxxxx> wrote:

> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -1888,6 +1888,7 @@ asmlinkage int vprintk_emit(int facility, int level,
>
> printed_len = log_output(facility, level, lflags, dict, dictlen, text, text_len);
>
> + wake_up_klogd();
> logbuf_unlock_irqrestore(flags);

You can't do this, because the scheduler can call printk_deferred()
with the rq lock held, and printk_deferred() will grab the logbuf lock.

Calling wake_up_klogd() will grab the rq lock and give us a A-B<->B-A
locking order.

-- Steve