From 69861722bbfa09b347e9e7465e9cfcad2e47f7f1 Mon Sep 17 00:00:00 2001 From: Junxiao Chang <junxiao.chang@intel.com> Date: Tue, 23 Jan 2024 13:40:32 +0800 Subject: [PATCH 195/204] printk: nbcon: move locked_port flag to struct uart_port Console pointer in uart_port might be shared among multiple uart ports. Flag port locked by nbcon should be saved in uart_port structure instead of in console structure. Fixes: 6424f396c49e ("printk: nbcon: Implement processing in port->lock wrapper") Suggested-by: John Ogness <john.ogness@linutronix.de> Signed-off-by: Junxiao Chang <junxiao.chang@intel.com> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Link: https://lore.kernel.org/all/20240123054033.183114-2-junxiao.chang@intel.com (cherry picked from commit d4fb86a96cb4a1efd24ca13a2ac234a1c9a3fdc5) Signed-off-by: Clark Williams <clark.williams@gmail.com> --- include/linux/console.h | 2 -- include/linux/serial_core.h | 1 + kernel/printk/nbcon.c | 8 ++++---- 3 files changed, 5 insertions(+), 6 deletions(-) Index: linux-6.6.58-rt45/include/linux/console.h =================================================================== @ linux-6.6.58-rt45/include/linux/console.h:307 @ struct nbcon_write_context { * @nbcon_state: State for nbcon consoles * @nbcon_seq: Sequence number of the next record for nbcon to print * @pbufs: Pointer to nbcon private buffer - * @locked_port: True, if the port lock is locked by nbcon * @kthread: Printer kthread for this console * @rcuwait: RCU-safe wait object for @kthread waking * @irq_work: Defer @kthread waking to IRQ work context @ linux-6.6.58-rt45/include/linux/console.h:340 @ struct console { atomic_t __private nbcon_state; atomic_long_t __private nbcon_seq; struct printk_buffers *pbufs; - bool locked_port; struct task_struct *kthread; struct rcuwait rcuwait; struct irq_work irq_work; Index: linux-6.6.58-rt45/include/linux/serial_core.h =================================================================== --- linux-6.6.58-rt45.orig/include/linux/serial_core.h +++ linux-6.6.58-rt45/include/linux/serial_core.h @ linux-6.6.58-rt45/include/linux/console.h:492 @ struct uart_port { struct uart_icount icount; /* statistics */ struct console *cons; /* struct console, if any */ + bool nbcon_locked_port; /* True, if the port is locked by nbcon */ /* flags must be updated while holding port mutex */ upf_t flags; Index: linux-6.6.58-rt45/kernel/printk/nbcon.c =================================================================== --- linux-6.6.58-rt45.orig/kernel/printk/nbcon.c +++ linux-6.6.58-rt45/kernel/printk/nbcon.c @ linux-6.6.58-rt45/include/linux/console.h:1589 @ void nbcon_acquire(struct uart_port *up) if (!uart_is_nbcon(up)) return; - WARN_ON_ONCE(con->locked_port); + WARN_ON_ONCE(up->nbcon_locked_port); do { do { @ linux-6.6.58-rt45/include/linux/console.h:1600 @ void nbcon_acquire(struct uart_port *up) } while (!nbcon_context_enter_unsafe(&ctxt)); - con->locked_port = true; + up->nbcon_locked_port = true; } EXPORT_SYMBOL_GPL(nbcon_acquire); @ linux-6.6.58-rt45/include/linux/console.h:1626 @ void nbcon_release(struct uart_port *up) .prio = NBCON_PRIO_NORMAL, }; - if (!con->locked_port) + if (!up->nbcon_locked_port) return; if (nbcon_context_exit_unsafe(&ctxt)) nbcon_context_release(&ctxt); - con->locked_port = false; + up->nbcon_locked_port = false; } EXPORT_SYMBOL_GPL(nbcon_release);