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

John Ogness
2024-05-02T21:38:45Z

Hi,

This is v5 of a series to wire up the nbcon consoles so that
they actually perform printing using their write_atomic()
callback. v4 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 and legacy
console flushing is triggered via irq_work.

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 v4:

- In serial_core_add_one_port(), initialize the port lock
before setting @cons (since uart_port_set_cons() uses the
port lock).

- For unregister_console_locked(), take the con->device_lock
when removing the console from the console list.

- Remove the struct nbcon_drvdata and instead rely on the port
lock being taken when adding/removing uart nbcon console list
items.

- Move the nbcon context for drivers into the struct console
(formery in struct nbcon_drvdata).

- Simplify the port lock wrapper implementation since we can
rely on the registration state not changing while the port
lock is held.

- Change nbcon_driver_acquire() to nbcon_driver_try_acquire()
in order to support try-semantics for the port lock wrappers.
Also update its kerneldoc to clarify its usage.

- Implement true try-lock semantics for the try-variants of the
port lock wrappers.

- Remove the retry-loop in __nbcon_atomic_flush_pending() since
there is never a need to retry. If a context takes over
ownership it also takes over responsibility to print the
records.

- Invert the return value of nbcon_atomic_emit_one() and
add kerneldoc and comments about the meaning of the return
value.

- For nbcon_legacy_emit_next_record() use the same return
value and kerneldoc explanation as nbcon_atomic_emit_one().

- Invert the meaning of the return value of
__nbcon_atomic_flush_pending_con() and use various errno
values to report the reason for failure.

- Add nbcon_atomic_flush_pending_con() to flush all records if
records were added while flushing. (Once printer threads are
available, we can rely on them to print the remaining
records.)

- For nbcon_driver_release(), flush all records if records were
added while holding the port lock. (Once printer threads are
available, we can rely on them to print the remaining
records.)

- Add nbcon_cpu_emergency_flush() to allow periodically
flushing if there has been many records stored in emergency
context. It also attempts legacy flushing when safe.

- Change lockdep_print_held_locks() and debug_show_all_locks()
to rely on their callers marking emergency sections because
these functions can be called in non-emergency situations.
Note that debug_show_all_locks() still calls
nbcon_cpu_emergency_flush() is case it used in emergency.

- Rename console_init_seq() to get_init_console_seq() and have
it return the new seq rather than setting @newcon->seq.

- Change nbcon_init() to take the initial sequence number as
an argument.

- For __pr_flush(), move the barrier() to ensure no
intermediate use of the printing_via_unlock() macro.

- For nbcon_cpu_emergency_exit(), update the comments and
WARN_ON_ONCE position as suggested.

- Move the printing_via_unlock() macro into internal.h so that
it can be used by nbcon.c as well (in
nbcon_cpu_emergency_flush()).

- Update the kerneldoc for nbcon callbacks write_atomic() and
device_lock().

- Add clarification in console_srcu_read_flags() kerneldoc.

- Change kerneldoc nbcon_context_try_acquire() context to
mention device_lock() or local_irq_save() requirement.

John Ogness

[0] https://lore.kernel.org/lkml/20240402221129.2613843-1-john.ogness@linutronix.de
[1] https://lore.kernel.org/lkml/20230302195618.156940-1-john.ogness@linutronix.de

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: Provide functions for drivers to acquire console for
non-printing
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 | 71 +++-
kernel/printk/nbcon.c | 488 +++++++++++++++++++++++++++-
kernel/printk/printk.c | 303 +++++++++++++----
kernel/printk/printk_ringbuffer.h | 2 +
kernel/printk/printk_safe.c | 12 +
kernel/rcu/tree_exp.h | 9 +
kernel/rcu/tree_stall.h | 11 +
15 files changed, 1148 insertions(+), 131 deletions(-)

base-commit: a2b4cab9da7746c42f87c13721d305baf0085a20
--
2.39.2