Re: [PATCH printk v3 11/19] printk: nbcon: Rely on kthreads for normal operation

From: Petr Mladek
Date: Wed Jul 31 2024 - 10:06:58 EST


On Mon 2024-07-22 19:25:31, John Ogness wrote:
> Once the kthread is running and available
> (i.e. @printk_kthreads_running is set), the kthread becomes
> responsible for flushing any pending messages which are added
> in NBCON_PRIO_NORMAL context. Namely the legacy
> console_flush_all() and device_release() no longer flush the
> console. And nbcon_atomic_flush_pending() used by
> nbcon_cpu_emergency_exit() no longer flushes messages added
> after the emergency messages.
>
> The console context is safe when used by the kthread only when
> one of the following conditions are true:
>
> 1. Other caller acquires the console context with
> NBCON_PRIO_NORMAL with preemption disabled. It will
> release the context before rescheduling.
>
> 2. Other caller acquires the console context with
> NBCON_PRIO_NORMAL under the device_lock.
>
> 3. The kthread is the only context which acquires the console
> with NBCON_PRIO_NORMAL.
>
> This is satisfied for all atomic printing call sites:
>
> nbcon_legacy_emit_next_record() (#1)
>
> nbcon_atomic_flush_pending_con() (#1)
>
> nbcon_device_release() (#2)
>
> It is even double guaranteed when @printk_kthreads_running
> is set because then _only_ the kthread will print for
> NBCON_PRIO_NORMAL. (#3)
>
> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -4102,8 +4139,10 @@ static bool __pr_flush(struct console *con, int timeout_ms, bool reset_on_progre
> * that they make forward progress, so only increment
> * @diff for usable consoles.
> */
> - if (!console_is_usable(c, flags, true))
> + if (!console_is_usable(c, flags, true) &&
> + !console_is_usable(c, flags, false)) {

This looks weird. nbcon console can't make progress when
"write_atomic" is not implemented and the kthreads are not
running.

I should be:

if (!((console_is_usable(c, flags, true)) ||
(console_is_usable(c, flags, false) && printk_kthreads_running))) {

That said. Do we really want to support nbcon consoles without
@write_atomic() callback?

It would make things easier when both callbacks are mandatory.

> continue;
> + }
>
> if (flags & CON_NBCON) {
> printk_seq = nbcon_seq_read(c);

Best Regards,
Petr