• John Ogness's avatar
    printk: Implement legacy printer kthread for PREEMPT_RT · 5f53ca3f
    John Ogness authored
    The write() callback of legacy consoles usually makes use of
    spinlocks. This is not permitted with PREEMPT_RT in atomic
    contexts.
    
    For PREEMPT_RT, create a new kthread to handle printing of all
    the legacy consoles (and nbcon consoles if boot consoles are
    registered). This allows legacy consoles to work on PREEMPT_RT
    without requiring modification. (However they will not have
    the reliability properties guaranteed by nbcon atomic
    consoles.)
    
    Use the existing printk_kthreads_check_locked() to start/stop
    the legacy kthread as needed.
    
    Introduce the macro force_legacy_kthread() to query if the
    forced threading of legacy consoles is in effect. Although
    currently only enabled for PREEMPT_RT, this acts as a simple
    mechanism for the future to allow other preemption models to
    easily take advantage of the non-interference property provided
    by the legacy kthread.
    
    When force_legacy_kthread() is true, the legacy kthread
    fulfills the role of the console_flush_type @legacy_offload by
    waking the legacy kthread instead of printing via the
    console_lock in the irq_work. If the legacy kthread is not
    yet available, no legacy printing takes place (unless in
    panic).
    
    If for some reason the legacy kthread fails to create, any
    legacy consoles are unregistered. With force_legacy_kthread(),
    the legacy kthread is a critical component for legacy consoles.
    
    These changes only affect CONFIG_PREEMPT_RT.
    Signed-off-by: default avatarJohn Ogness <john.ogness@linutronix.de>
    Reviewed-by: default avatarPetr Mladek <pmladek@suse.com>
    Link: https://lore.kernel.org/r/20240904120536.115780-16-john.ogness@linutronix.deSigned-off-by: default avatarPetr Mladek <pmladek@suse.com>
    5f53ca3f
printk_safe.c 1.44 KB