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