Re: [PATCH 0/2] printk: Prevent printk kthreads from blocking direct console handling

From: Paul E. McKenney
Date: Wed Jun 15 2022 - 13:10:50 EST


On Wed, Jun 15, 2022 at 06:28:03PM +0200, Petr Mladek wrote:
> There are reports that console kthreads prevented printing
> messages during panic() or shutdown(), see
> BugLink: https://lore.kernel.org/r/20220610205038.GA3050413@paulmck-ThinkPad-P17-Gen-1
> BugLink: https://lore.kernel.org/r/CAMdYzYpF4FNTBPZsEFeWRuEwSies36QM_As8osPWZSr2q-viEA@xxxxxxxxxxxxxx
>
> In both situations, printk() correctly tries to flush the consoles
> directly but it fails to get the global console_lock(). Both
> problems went away with these patches:
>
> 1st patch blocks console kthreads so that they do not start
> handling new messages when the direct printing is preferred
> by the system state. It is probably enough on its own. It
> solves the problem when the kthreads actively did
> the wrong thing.
>
> 2nd patch allows to wait for the console kthreads to release
> the lock in any context. It should make it more reliable.
> It would have been useful even for the legacy code.

Thank you!

For the series:

Tested-by: Paul E. McKenney <paulmck@xxxxxxxxxx>

> More possible improvements:
>
> + the waiting might be necessary also in the suspend code paths
>
> + convert con->mutex to con->spinlock to avoid blocking
> the global console_lock() when sleeping with con->lock
>
> + at least disable preemption around console_emit_next_record()
> in console kthread to avoid sleeping in the console driver
> code
>
> + somehow change the priority of the kthread so that it gets
> scheduled immediately when the scheduler works
>
> Petr Mladek (2):
> printk: Block console kthreads when direct printing will be required
> printk: Wait for the global console lock when the system is going down
>
> include/linux/printk.h | 5 +++++
> kernel/panic.c | 2 ++
> kernel/printk/internal.h | 2 ++
> kernel/printk/printk.c | 8 +++++++-
> kernel/printk/printk_safe.c | 32 ++++++++++++++++++++++++++++++++
> kernel/reboot.c | 2 ++
> 6 files changed, 50 insertions(+), 1 deletion(-)
>
> --
> 2.35.3
>