printk: nbcon: Add callbacks to synchronize with driver
BugLink: https://bugs.launchpad.net/bugs/2060704 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> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Kevin Becker <kevin.becker@canonical.com>
This commit is contained in:
committed by
Kevin Becker
parent
d4aaab3e41
commit
3a5c4daac8
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user