The current usage of console_is_usable() is clumsy. The parameter @use_atomic is boolean and thus not self-explanatory. The function is called twice in situations when there are no-strict requirements.
Replace it with enum nbcon_write_cb which provides a more descriptive values for all 3 situations: atomic, thread or any. Note that console_is_usable() checks only NBCON_USE_ATOMIC because .write_thread() callback is mandatory. But the other two values still make sense because they describe the intention of the caller. Suggested-by: Petr Mladek <[email protected]> Signed-off-by: Marcos Paulo de Souza <[email protected]> --- arch/um/kernel/kmsg_dump.c | 3 ++- include/linux/console.h | 20 +++++++++++++++++--- kernel/debug/kdb/kdb_io.c | 2 +- kernel/printk/nbcon.c | 8 ++++---- kernel/printk/printk.c | 16 ++++++++-------- 5 files changed, 32 insertions(+), 17 deletions(-) diff --git a/arch/um/kernel/kmsg_dump.c b/arch/um/kernel/kmsg_dump.c index fc0f543d1d8e..8ae38308b67c 100644 --- a/arch/um/kernel/kmsg_dump.c +++ b/arch/um/kernel/kmsg_dump.c @@ -31,7 +31,8 @@ static void kmsg_dumper_stdout(struct kmsg_dumper *dumper, * expected to output the crash information. */ if (strcmp(con->name, "ttynull") != 0 && - console_is_usable(con, console_srcu_read_flags(con), true)) { + console_is_usable(con, console_srcu_read_flags(con), + NBCON_USE_ATOMIC)) { break; } } diff --git a/include/linux/console.h b/include/linux/console.h index fc9f5c5c1b04..35c03fc4ed51 100644 --- a/include/linux/console.h +++ b/include/linux/console.h @@ -202,6 +202,19 @@ enum cons_flags { CON_NBCON_ATOMIC_UNSAFE = BIT(9), }; +/** + * enum nbcon_write_cb - Defines which nbcon write() callback must be used based + * on the caller context. + * @NBCON_USE_ATOMIC: Use con->write_atomic(). + * @NBCON_USE_THREAD: Use con->write_thread(). + * @NBCON_USE_ANY: The caller does not have any strict requirements. + */ +enum nbcon_write_cb { + NBCON_USE_ATOMIC, + NBCON_USE_THREAD, + NBCON_USE_ANY, +}; + /** * struct nbcon_state - console state for nbcon consoles * @atom: Compound of the state fields for atomic operations @@ -622,7 +635,8 @@ extern void nbcon_kdb_release(struct nbcon_write_context *wctxt); * which can also play a role in deciding if @con can be used to print * records. */ -static inline bool console_is_usable(struct console *con, short flags, bool use_atomic) +static inline bool console_is_usable(struct console *con, short flags, + enum nbcon_write_cb nwc) { if (!(flags & CON_ENABLED)) return false; @@ -631,7 +645,7 @@ static inline bool console_is_usable(struct console *con, short flags, bool use_ return false; if (flags & CON_NBCON) { - if (use_atomic) { + if (nwc & NBCON_USE_ATOMIC) { /* The write_atomic() callback is optional. */ if (!con->write_atomic) return false; @@ -679,7 +693,7 @@ static inline bool nbcon_kdb_try_acquire(struct console *con, struct nbcon_write_context *wctxt) { return false; } static inline void nbcon_kdb_release(struct nbcon_write_context *wctxt) { } static inline bool console_is_usable(struct console *con, short flags, - bool use_atomic) { return false; } + enum nbcon_write_cb nwc) { return false; } #endif extern int console_set_on_cmdline; diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c index 61c1690058ed..6ffb962392a4 100644 --- a/kernel/debug/kdb/kdb_io.c +++ b/kernel/debug/kdb/kdb_io.c @@ -591,7 +591,7 @@ static void kdb_msg_write(const char *msg, int msg_len) for_each_console_srcu(c) { short flags = console_srcu_read_flags(c); - if (!console_is_usable(c, flags, true)) + if (!console_is_usable(c, flags, NBCON_USE_ATOMIC)) continue; if (c == dbg_io_ops->cons) continue; diff --git a/kernel/printk/nbcon.c b/kernel/printk/nbcon.c index be5a04367e60..13865ef85990 100644 --- a/kernel/printk/nbcon.c +++ b/kernel/printk/nbcon.c @@ -1184,7 +1184,7 @@ static bool nbcon_kthread_should_wakeup(struct console *con, struct nbcon_contex cookie = console_srcu_read_lock(); flags = console_srcu_read_flags(con); - if (console_is_usable(con, flags, false)) { + if (console_is_usable(con, flags, NBCON_USE_THREAD)) { /* Bring the sequence in @ctxt up to date */ ctxt->seq = nbcon_seq_read(con); @@ -1251,7 +1251,7 @@ static int nbcon_kthread_func(void *__console) con_flags = console_srcu_read_flags(con); - if (console_is_usable(con, con_flags, false)) + if (console_is_usable(con, con_flags, NBCON_USE_THREAD)) backlog = nbcon_emit_one(&wctxt, false); console_srcu_read_unlock(cookie); @@ -1650,7 +1650,7 @@ static void __nbcon_atomic_flush_pending(u64 stop_seq) if (!(flags & CON_NBCON)) continue; - if (!console_is_usable(con, flags, true)) + if (!console_is_usable(con, flags, NBCON_USE_ATOMIC)) continue; if (nbcon_seq_read(con) >= stop_seq) @@ -1904,7 +1904,7 @@ void nbcon_device_release(struct console *con) */ cookie = console_srcu_read_lock(); printk_get_console_flush_type(&ft); - if (console_is_usable(con, console_srcu_read_flags(con), true) && + if (console_is_usable(con, console_srcu_read_flags(con), NBCON_USE_ATOMIC) && !ft.nbcon_offload && prb_read_valid(prb, nbcon_seq_read(con), NULL)) { /* diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 7394f1b6033b..5f4b84f9562e 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -3203,7 +3203,9 @@ static bool console_flush_one_record(bool do_cond_resched, u64 *next_seq, bool * if ((flags & CON_NBCON) && (ft.nbcon_atomic || ft.nbcon_offload)) continue; - if (!console_is_usable(con, flags, !do_cond_resched)) + if (!console_is_usable(con, flags, + do_cond_resched ? NBCON_USE_THREAD + : NBCON_USE_ATOMIC)) continue; any_usable = true; @@ -3392,7 +3394,7 @@ void console_unblank(void) */ cookie = console_srcu_read_lock(); for_each_console_srcu(c) { - if (!console_is_usable(c, console_srcu_read_flags(c), true)) + if (!console_is_usable(c, console_srcu_read_flags(c), NBCON_USE_ATOMIC)) continue; if (c->unblank) { @@ -3432,7 +3434,7 @@ void console_unblank(void) cookie = console_srcu_read_lock(); for_each_console_srcu(c) { - if (!console_is_usable(c, console_srcu_read_flags(c), true)) + if (!console_is_usable(c, console_srcu_read_flags(c), NBCON_USE_ATOMIC)) continue; if (c->unblank) @@ -3633,7 +3635,7 @@ static bool legacy_kthread_should_wakeup(void) if ((flags & CON_NBCON) && (ft.nbcon_atomic || ft.nbcon_offload)) continue; - if (!console_is_usable(con, flags, false)) + if (!console_is_usable(con, flags, NBCON_USE_THREAD)) continue; if (flags & CON_NBCON) { @@ -4204,7 +4206,7 @@ static int unregister_console_locked(struct console *console) if (!console_is_registered_locked(console)) res = -ENODEV; - else if (console_is_usable(console, console->flags, true)) + else if (console_is_usable(console, console->flags, NBCON_USE_ATOMIC)) __pr_flush(console, 1000, true); /* Disable it unconditionally */ @@ -4485,10 +4487,8 @@ static bool __pr_flush(struct console *con, int timeout_ms, bool reset_on_progre * that they make forward progress, so only increment * @diff for usable consoles. */ - if (!console_is_usable(c, flags, true) && - !console_is_usable(c, flags, false)) { + if (!console_is_usable(c, flags, NBCON_USE_ANY)) continue; - } if (flags & CON_NBCON) { printk_seq = nbcon_seq_read(c); -- 2.52.0
