Re: [PATCH printk v1 03/18] printk: Consolidate console deferred printing

From: Petr Mladek
Date: Wed Mar 08 2023 - 08:20:30 EST


On Thu 2023-03-02 21:02:03, John Ogness wrote:
> Printig to consoles can be deferred for several reasons:
>
> - explicitly with printk_deferred()
> - printk() in NMI context
> - recursive printk() calls
>
> The current implementation is not consistent. For printk_deferred(),
> irq work is scheduled twice. For NMI und recursive, panic CPU
> suppression and caller delays are not properly enforced.
>
> Correct these inconsistencies by consolidating the deferred printing
> code so that vprintk_deferred() is the toplevel function for
> deferred printing and vprintk_emit() will perform whichever irq_work
> queueing is appropriate.
>
> Also add kerneldoc for wake_up_klogd() and defer_console_output() to
> clarify their differences and appropriate usage.

> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -2321,7 +2321,10 @@ asmlinkage int vprintk_emit(int facility, int level,
> preempt_enable();
> }
>
> - wake_up_klogd();
> + if (in_sched)
> + defer_console_output();
> + else
> + wake_up_klogd();

Nit: I would add an empty line here. Or I would move this up into the
previous if (in_sched()) condition.

> return printed_len;
> }
> EXPORT_SYMBOL(vprintk_emit);
> @@ -3811,11 +3814,30 @@ static void __wake_up_klogd(int val)
> preempt_enable();
> }
>
> +/**
> + * wake_up_klogd - Wake kernel logging daemon
> + *
> + * Use this function when new records have been added to the ringbuffer
> + * and the console printing for those records is handled elsewhere. In

"elsewhere" is ambiguous. I would write:

"and the console printing for those records maybe handled in this context".

> + * this case only the logging daemon needs to be woken.
> + *
> + * Context: Any context.
> + */
> void wake_up_klogd(void)
> {
> __wake_up_klogd(PRINTK_PENDING_WAKEUP);
> }
>

Anyway, I like this change.

Best Regards,
Petr