Commit c903327d3295 for kernel

commit c903327d3295b135eb8c81ebe0b68c1837718eb8
Merge: daa394f0f9d3 daeed1595b4d
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Tue Sep 17 08:52:28 2024 +0200

    Merge tag 'printk-for-6.12' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux

    Pull printk updates from Petr Mladek:
     "This is the "last" part of the support for the new nbcon consoles.
      Where "nbcon" stays for "No Big console lock CONsoles" aka not under
      the console_lock.

      New callbacks are added to struct console:

       - write_thread() for flushing nbcon consoles in task context.

       - write_atomic() for flushing nbcon consoles in atomic context,
         including NMI.

       - con->device_lock() and device_unlock() for taking the driver
         specific lock, for example, port->lock.

      New printk-specific kthreads are created:

       - per-console kthreads which get responsible for flushing normal
         priority messages on nbcon consoles.

       - thread which gets responsible for flushing normal priority messages
         on all consoles when CONFIG_RT enabled.

      The new callbacks are called under a special per-console lock which
      has already been added back in v6.7. It allows to distinguish three
      severities: normal, emergency, and panic. A context with a higher
      priority could take over the ownership when it is safe even in the
      middle of handling a record. The panic context could do it even when
      it is not safe. But it is allowed only for the final desperate flush
      before entering the infinite loop.

      The new lock helps to flush the messages directly in emergency and
      panic contexts. But it is not enough in all situations:

       - console_lock() is still need for synchronization against boot
         consoles.

       - con->device_lock() is need for synchronization against other
         operations on the same HW, e.g. serial port speed setting,
         non-printk related read/write.

      The dependency on con->device_lock() is mutual. Any code taking the
      driver specific lock has to acquire the related nbcon console context
      as well. For example, see the new uart_port_lock() API. It provides
      the necessary synchronization against emergency and panic contexts
      where the messages are flushed only under the new per-console lock.

      Maybe surprisingly, a quite tricky part is the decision how to flush
      the consoles in various situations. It has to take into account:

       - message priority:    normal, emergency, panic

       - scheduling context:  task, atomic, deferred_legacy

       - registered consoles: boot, legacy, nbcon

       - threads are running: early boot, suspend, shutdown, panic

       - caller:              printk(), pr_flush(), printk_flush_in_panic(),
                              console_unlock(), console_start(), ...

      The primary decision is made in printk_get_console_flush_type(). It
      creates a hint what the caller should do:

       - flush nbcon consoles directly or via the kthread

       - call the legacy loop (console_unlock()) directly or via irq_work

      The existing behavior is preserved for the legacy consoles. The only
      exception is that they are not longer flushed directly from printk()
      in panic() before CPUs are stopped. But this blocking happens only
      when at least one nbcon console is registered. The motivation is to
      increase a chance to produce the crash dump. They legacy consoles
      might create a deadlock in compare with nbcon consoles. The nbcon
      console should allow to see the messages even when the crash dump
      fails.

      There are three possible ways how nbcon consoles are flushed:

       - The per-nbcon-console kthread is responsible for flushing messages
         added with the normal priority. This is the default mode.

       - The legacy loop, aka console_unlock(), is used when there is still
         a boot console registered. There is no easy way how to match an
         early console driver with a nbcon console driver. And the
         console_lock() provides the only reliable serialization at the
         moment.

         The legacy loop uses either con->write_atomic() or
         con->write_thread() callbacks depending on whether it is allowed to
         schedule. The atomic variant has to be used from printk().

       - In other situations, the messages are flushed directly using
         write_atomic() which can be called in any context, including NMI.
         It is primary needed during early boot or shutdown, in emergency
         situations, and panic.

      The emergency priority is used by a code called within
      nbcon_cpu_emergency_enter()/exit(). At the moment, it is used in four
      situations: WARN(), Oops, lockdep, and RCU stall reports.

      Finally, there is no nbcon console at the moment. It means that the
      changes should _not_ modify the existing behavior. The only exception
      is CONFIG_RT which would force offloading the legacy loop, for normal
      priority context, into the dedicated kthread"

    * tag 'printk-for-6.12' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux: (54 commits)
      printk: Avoid false positive lockdep report for legacy printing
      printk: nbcon: Assign nice -20 for printing threads
      printk: Implement legacy printer kthread for PREEMPT_RT
      tty: sysfs: Add nbcon support for 'active'
      proc: Add nbcon support for /proc/consoles
      proc: consoles: Add notation to c_start/c_stop
      printk: nbcon: Show replay message on takeover
      printk: Provide helper for message prepending
      printk: nbcon: Rely on kthreads for normal operation
      printk: nbcon: Use thread callback if in task context for legacy
      printk: nbcon: Relocate nbcon_atomic_emit_one()
      printk: nbcon: Introduce printer kthreads
      printk: nbcon: Init @nbcon_seq to highest possible
      printk: nbcon: Add context to usable() and emit()
      printk: Flush console on unregister_console()
      printk: Fail pr_flush() if before SYSTEM_SCHEDULING
      printk: nbcon: Add function for printers to reacquire ownership
      printk: nbcon: Use raw_cpu_ptr() instead of open coding
      printk: Use the BITS_PER_LONG macro
      lockdep: Mark emergency sections in lockdep splats
      ...