Messages in this thread Patch in this message | | | From | John Ogness <> | Subject | [PATCH printk v4 06/27] printk: nbcon: Add callbacks to synchronize with driver | Date | Wed, 3 Apr 2024 00:17:08 +0206 |
| |
Console drivers typically must deal with access to the hardware via user input/output (such as an interactive login shell) and output of kernel messages via printk() calls.
Follow-up commits require that the printk subsystem is able to synchronize with the driver. Require nbcon consoles to implement two new callbacks (device_lock(), device_unlock()) that will use whatever synchronization mechanism the driver is using for itself (for example, the port lock for uart serial consoles).
Signed-off-by: John Ogness <john.ogness@linutronix.de> --- include/linux/console.h | 42 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+)
diff --git a/include/linux/console.h b/include/linux/console.h index e4028d4079e1..ad85594e070e 100644 --- a/include/linux/console.h +++ b/include/linux/console.h @@ -352,6 +352,48 @@ struct console { */ void (*write_atomic)(struct console *con, struct nbcon_write_context *wctxt); + /** + * @device_lock: + * + * NBCON callback to begin synchronization with driver code. + * + * Console drivers typically must deal with access to the hardware + * via user input/output (such as an interactive login shell) and + * output of kernel messages via printk() calls. This callback is + * called by the printk-subsystem whenever it needs to synchronize + * with hardware access by the driver. It should be implemented to + * use whatever synchronization mechanism the driver is using for + * itself (for example, the port lock for uart serial consoles). + * + * This callback is always called from task context. It may use any + * synchronization method required by the driver. BUT this callback + * MUST also disable migration. The console driver may be using a + * synchronization mechanism that already takes care of this (such as + * spinlocks). Otherwise this function must explicitly call + * migrate_disable(). + * + * The flags argument is provided as a convenience to the driver. It + * will be passed again to device_unlock(). It can be ignored if the + * driver does not need it. + */ + void (*device_lock)(struct console *con, unsigned long *flags); + + /** + * @device_unlock: + * + * NBCON callback to finish synchronization with driver code. + * + * It is the counterpart to device_lock(). + * + * This callback is always called from task context. It must + * appropriately re-enable migration (depending on how device_lock() + * disabled migration). + * + * The flags argument is the value of the same variable that was + * passed to device_lock(). + */ + void (*device_unlock)(struct console *con, unsigned long flags); + atomic_t __private nbcon_state; atomic_long_t __private nbcon_seq; struct printk_buffers *pbufs; -- 2.39.2
| |