[PATCH printk v6 00/30] wire up write_atomic() printing

From: John Ogness
Date: Mon May 27 2024 - 02:38:34 EST


Hi,

This is v6 of a series to wire up the nbcon consoles so that
they actually perform printing using their write_atomic()
callback. v5 is here [0]. For information about the motivation
of the atomic consoles, please read the cover letter of v1 [1].

The main focus of this series:

- For nbcon consoles, always call write_atomic() directly from
printk() caller context for the panic CPU.

- For nbcon consoles, call write_atomic() when unlocking the
console lock.

- Only perform the console lock/unlock dance if legacy or boot
consoles are registered.

- For legacy consoles, if nbcon consoles are registered, do not
attempt to print from printk() caller context for the panic
CPU until nbcon consoles have had a chance to print the most
significant messages.

- Mark emergency sections. In these sections printk() calls
will only store the messages. Upon exiting the emergency
section, nbcon consoles are flushed directly. If legacy
consoles cannot be flushed safely, an irq_work is triggered
to do the legacy console flushing.

This series does _not_ include threaded printing or nbcon
drivers. Those features will be added in separate follow-up
series.

Note: With this series, a system with _only_ nbcon consoles
registered will not perform console printing unless the
console lock or nbcon port lock are used or on panic.
This is on purpose. When nbcon kthreads are introduced,
they will fill the gaps.

The changes since v5:

- In struct console, rename @nbcon_driver_ctxt to
@nbcon_device_ctxt.

- Rename nbcon_driver_try_acquire() to
nbcon_device_try_acquire().

- Rename nbcon_driver_release() to nbcon_device_release().

- Implement a helper function is_printk_deferred() for use in
nbcon_cpu_emergency_exit(), nbcon_cpu_emergency_flush(),
vprintk().

- In nbcon_cpu_emergency_exit(), for legacy consoles, try to
flush directly if safe. If legacy flushing directly was
successful, do not trigger the irq_work.

- In nbcon_cpu_emergency_exit(), do not decrement
@cpu_emergency_nesting if it is zero (and WARN_ON_ONCE in
this case).

- For register_console() and unregister_console_locked(), use a
local variable @use_device_lock to track if locking is used
so that the compiler knows that the lock and unlock match.

- For synchronize_rcu_expedited_wait(), move the
nbcon_cpu_emergency_flush() after dump_cpu_task().

- Refactor nbcon_atomic_flush_pending_con() as suggested by
pmladek. No functional change.

- Update various comments as suggested by pmladek.

- In nbcon_device_try_acquire(), add missing kerneldoc for the
return value.

John Ogness

[0] https://lore.kernel.org/lkml/20240502213839.376636-1-john.ogness@xxxxxxxxxxxxx
[1] https://lore.kernel.org/lkml/20230302195618.156940-1-john.ogness@xxxxxxxxxxxxx

John Ogness (25):
printk: Add notation to console_srcu locking
printk: nbcon: Remove return value for write_atomic()
printk: nbcon: Add detailed doc for write_atomic()
printk: nbcon: Add callbacks to synchronize with driver
printk: nbcon: Use driver synchronization while (un)registering
serial: core: Provide low-level functions to lock port
serial: core: Introduce wrapper to set @uart_port->cons
console: Improve console_srcu_read_flags() comments
nbcon: Add API to acquire context for non-printing operations
serial: core: Implement processing in port->lock wrapper
printk: nbcon: Do not rely on proxy headers
printk: nbcon: Fix kerneldoc for enums
printk: Make console_is_usable() available to nbcon
printk: Let console_is_usable() handle nbcon
printk: Add @flags argument for console_is_usable()
printk: nbcon: Add helper to assign priority based on CPU state
printk: Track registered boot consoles
printk: nbcon: Use nbcon consoles in console_flush_all()
printk: nbcon: Add unsafe flushing on panic
printk: Avoid console_lock dance if no legacy or boot consoles
printk: Track nbcon consoles
printk: Coordinate direct printing in panic
panic: Mark emergency section in oops
rcu: Mark emergency sections in rcu stalls
lockdep: Mark emergency sections in lockdep splats

Petr Mladek (1):
printk: Properly deal with nbcon consoles on seq init

Sebastian Andrzej Siewior (1):
printk: Check printk_deferred_enter()/_exit() usage

Thomas Gleixner (3):
printk: nbcon: Provide function to flush using write_atomic()
printk: nbcon: Implement emergency sections
panic: Mark emergency section in warn

drivers/tty/serial/8250/8250_core.c | 6 +-
drivers/tty/serial/amba-pl011.c | 2 +-
drivers/tty/serial/serial_core.c | 16 +-
include/linux/console.h | 116 ++++++-
include/linux/printk.h | 33 +-
include/linux/serial_core.h | 117 ++++++-
kernel/locking/lockdep.c | 84 ++++-
kernel/panic.c | 9 +
kernel/printk/internal.h | 73 +++-
kernel/printk/nbcon.c | 506 +++++++++++++++++++++++++++-
kernel/printk/printk.c | 307 +++++++++++++----
kernel/printk/printk_ringbuffer.h | 2 +
kernel/printk/printk_safe.c | 23 +-
kernel/rcu/tree_exp.h | 9 +
kernel/rcu/tree_stall.h | 11 +
15 files changed, 1181 insertions(+), 133 deletions(-)


base-commit: 596ffa476e201ecbf7ea024f1b59d4f28e91060c
--
2.39.2