* [PATCH printk v2 00/38] reduce console_lock scope
@ 2022-10-19 14:55 John Ogness
2022-10-19 14:55 ` [PATCH printk v2 24/38] xen: fbfront: use srcu console list iterator John Ogness
2022-10-19 14:56 ` [PATCH printk v2 38/38] printk, xen: fbfront: create/use safe function for forcing preferred John Ogness
0 siblings, 2 replies; 7+ messages in thread
From: John Ogness @ 2022-10-19 14:55 UTC (permalink / raw)
To: Petr Mladek
Cc: Sergey Senozhatsky, Steven Rostedt, Thomas Gleixner, linux-kernel,
Jason Wessel, Paul E. McKenney, Daniel Thompson, Douglas Anderson,
Greg Kroah-Hartman, Jiri Slaby, kgdb-bugreport, linux-serial,
linux-fsdevel, Miguel Ojeda, Geert Uytterhoeven, linux-m68k,
Richard Weinberger, Anton Ivanov, Johannes Berg, linux-um,
Ard Biesheuvel, linux-efi, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, netdev, Shile Zhang, Xianting Tian,
linuxppc-dev, Krzysztof Kozlowski, Alim Akhtar, linux-arm-kernel,
linux-samsung-soc, Michal Simek, Peter Zijlstra, Mike Rapoport,
Mathias Nyman, Andrew Morton, linux-usb, Luis Chamberlain,
Aaron Tomlin, Helge Deller, Thomas Zimmermann,
Javier Martinez Canillas, Boris Ostrovsky, Juergen Gross, Tom Rix,
linux-fbdev, dri-devel
This is v2 of a series to prepare for threaded/atomic
printing. It is a rework of patches 6-12 of the v1 [0]. From
the v1, patches 1-5 are already mainline and a rework of
patches >12 will be posted in a later series.
This series focuses on reducing the scope of the BKL
console_lock. It achieves this by switching to SRCU and a
dedicated mutex for console list iteration and modification,
respectively. The console_lock will no longer offer this
protection and is completely removed from
(un)register_console() and console_stop/start() code.
All users of the console_lock for list iteration have been
modified. For the call sites where the console_lock is still
needed (because of other reasons), I added comments to explain
exactly why the console_lock was needed.
The base commit for this series is from Paul McKenney's RCU tree
and provides an NMI-safe SRCU implementation [1]. Without the
NMI-safe SRCU implementation, this series is not less safe than
mainline. But we will need the NMI-safe SRCU implementation for
atomic consoles anyway, so we might as well get it in
now. Especially since it _does_ increase the reliability for
mainline in the panic path.
Changes since v2:
general:
- introduce console_is_enabled() to document safe data race on
console->flags
- switch all "console->flags & CON_ENABLED" code sites to
console_is_enabled()
- add "for_each_console_srcu" to .clang-format
- cleanup/clarify comments relating to console_lock
coverage/usage
um:
- kmsg_dumper: use srcu instead of console_lock for list
iteration
kgdb/kdb:
- configure_kgdboc: keep console_lock for console->device()
synchronization, use srcu for list iteration
- kgdboc_earlycon_pre_exp_handler: use srcu instead of
documenting unsafety for list iteration
- kgdboc_earlycon_init: use console_list_lock instead of
console_lock to lock list
- kdb_msg_write: use srcu instead of documenting unsafety for
list iteration
tty:
- show_cons_active: keep console_lock for console->device()
synchronization
fbdev:
- xen-fbfront: xenfb_probe: use srcu instead of console_lock
for list iteration, introduce console_force_preferred() to
safely implement hack
proc/consoles:
- show_console_dev: keep console_lock for console->device()
synchronization
- c_next: use hlist_entry_safe() instead of
hlist_for_each_entry_continue()
printk:
- remove console_lock from console_stop/start() and
(un)register_console()
- introduce console_srcu_read_(un)lock() to wrap scru read
(un)lock
- rename cons_first() macro to console_first()
- for_each_console: add lockdep check instead of introducing
new for_each_registered_console()
- console_list_lock: add warning if in read-side critical
section
- release srcu read lock on handover
- console_flush_all: use srcu instead of relying on console
lock for list iteration
- console_unblank: use srcu instead of relying on console_lock
for list iteration
- console_flush_on_panic: use srcu for list iteration and
document console->seq race
- device: keep console_lock for console->device()
synchronization, usr srcu for list iteration
- register_console: split list adding logic into the 3 distinct
scenarios
- register_console: set initial sequence number before adding
to list
- unregister_console: fix ENODEV return value if the console is
not registered
- console_stop: synchronize srcu
- printk_late_init: use _safe variant of iteration
- __pr_flush: use srcu instead of relying on console_lock for
list iteration
John Ogness
[0] https://lore.kernel.org/r/20220924000454.3319186-1-john.ogness@linutronix.de
[1] https://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git/log/?h=srcunmisafe.2022.10.18b
John Ogness (37):
printk: Convert console_drivers list to hlist
printk: Prepare for SRCU console list protection
printk: introduce console_is_enabled() wrapper
printk: use console_is_enabled()
tty: nfcon: use console_is_enabled()
um: kmsg_dump: use console_is_enabled()
efi: earlycon: use console_is_enabled()
netconsole: use console_is_enabled()
tty: hvc: use console_is_enabled()
tty: serial: earlycon: use console_is_enabled()
tty: serial: kgdboc: use console_is_enabled()
tty: serial: pic32_uart: use console_is_enabled()
tty: serial: samsung_tty: use console_is_enabled()
tty: serial: serial_core: use console_is_enabled()
tty: serial: xilinx_uartps: use console_is_enabled()
tty: tty_io: use console_is_enabled()
usb: early: xhci-dbc: use console_is_enabled()
kdb: kdb_io: use console_is_enabled()
um: kmsg_dumper: use srcu console list iterator
serial: kgdboc: use srcu console list iterator
serial: kgdboc: document console_lock usage
tty: tty_io: document console_lock usage
xen: fbfront: use srcu console list iterator
proc: consoles: document console_lock usage
kdb: use srcu console list iterator
printk: console_flush_all: use srcu console list iterator
printk: console_unblank: use srcu console list iterator
printk: console_flush_on_panic: use srcu console list iterator
printk: console_device: use srcu console list iterator
printk: register_console: use srcu console list iterator
printk: __pr_flush: use srcu console list iterator
printk: introduce console_list_lock
serial: kgdboc: use console_list_lock instead of console_lock
tty: tty_io: use console_list_lock for list synchronization
proc: consoles: use console_list_lock for list iteration
printk: relieve console_lock of list synchronization duties
printk, xen: fbfront: create/use safe function for forcing preferred
Thomas Gleixner (1):
serial: kgdboc: Lock console list in probe function
.clang-format | 1 +
arch/m68k/emu/nfcon.c | 4 +-
arch/um/kernel/kmsg_dump.c | 15 +-
drivers/firmware/efi/earlycon.c | 4 +-
drivers/net/netconsole.c | 4 +-
drivers/tty/hvc/hvc_console.c | 2 +-
drivers/tty/serial/earlycon.c | 4 +-
drivers/tty/serial/kgdboc.c | 37 ++-
drivers/tty/serial/pic32_uart.c | 2 +-
drivers/tty/serial/samsung_tty.c | 2 +-
drivers/tty/serial/serial_core.c | 2 +-
drivers/tty/serial/xilinx_uartps.c | 2 +-
drivers/tty/tty_io.c | 18 +-
drivers/usb/early/xhci-dbc.c | 2 +-
drivers/video/fbdev/xen-fbfront.c | 16 +-
fs/proc/consoles.c | 20 +-
include/linux/console.h | 75 +++++-
include/linux/serial_core.h | 2 +-
kernel/debug/kdb/kdb_io.c | 7 +-
kernel/printk/printk.c | 373 +++++++++++++++++++++--------
20 files changed, 438 insertions(+), 154 deletions(-)
base-commit: c2d158a284abd63d727dad7402a2eed650dd4233
--
2.30.2
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH printk v2 24/38] xen: fbfront: use srcu console list iterator
2022-10-19 14:55 [PATCH printk v2 00/38] reduce console_lock scope John Ogness
@ 2022-10-19 14:55 ` John Ogness
2022-10-25 13:39 ` Petr Mladek
2022-10-19 14:56 ` [PATCH printk v2 38/38] printk, xen: fbfront: create/use safe function for forcing preferred John Ogness
1 sibling, 1 reply; 7+ messages in thread
From: John Ogness @ 2022-10-19 14:55 UTC (permalink / raw)
To: Petr Mladek
Cc: Sergey Senozhatsky, Steven Rostedt, Thomas Gleixner, linux-kernel,
Helge Deller, Thomas Zimmermann, Javier Martinez Canillas,
Boris Ostrovsky, Juergen Gross, Tom Rix, linux-fbdev, dri-devel
Since the console_lock is not being used for anything other than
safe console list traversal, use srcu console list iteration instead.
Signed-off-by: John Ogness <john.ogness@linutronix.de>
---
drivers/video/fbdev/xen-fbfront.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/video/fbdev/xen-fbfront.c b/drivers/video/fbdev/xen-fbfront.c
index 4d2694d904aa..2552c853c6c2 100644
--- a/drivers/video/fbdev/xen-fbfront.c
+++ b/drivers/video/fbdev/xen-fbfront.c
@@ -500,16 +500,18 @@ static int xenfb_probe(struct xenbus_device *dev,
static void xenfb_make_preferred_console(void)
{
struct console *c;
+ int cookie;
if (console_set_on_cmdline)
return;
- console_lock();
- for_each_console(c) {
+ cookie = console_srcu_read_lock();
+ for_each_console_srcu(c) {
if (!strcmp(c->name, "tty") && c->index == 0)
break;
}
- console_unlock();
+ console_srcu_read_unlock(cookie);
+
if (c) {
unregister_console(c);
c->flags |= CON_CONSDEV;
--
2.30.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH printk v2 38/38] printk, xen: fbfront: create/use safe function for forcing preferred
2022-10-19 14:55 [PATCH printk v2 00/38] reduce console_lock scope John Ogness
2022-10-19 14:55 ` [PATCH printk v2 24/38] xen: fbfront: use srcu console list iterator John Ogness
@ 2022-10-19 14:56 ` John Ogness
2022-10-27 13:18 ` Petr Mladek
1 sibling, 1 reply; 7+ messages in thread
From: John Ogness @ 2022-10-19 14:56 UTC (permalink / raw)
To: Petr Mladek
Cc: Sergey Senozhatsky, Steven Rostedt, Thomas Gleixner, linux-kernel,
Helge Deller, Greg Kroah-Hartman, Javier Martinez Canillas,
Thomas Zimmermann, Juergen Gross, Boris Ostrovsky, Tom Rix,
linux-fbdev, dri-devel
With commit 9e124fe16ff2("xen: Enable console tty by default in domU
if it's not a dummy") a hack was implemented to make sure that the
tty console remains the console behind the /dev/console device. The
main problem with the hack is that, after getting the console pointer
to the tty console, it is assumed the pointer is still valid after
releasing the console_sem. This assumption is incorrect and unsafe.
Make the hack safe by introducing a new function
console_force_preferred() to perform the full operation under
the console_list_lock.
Signed-off-by: John Ogness <john.ogness@linutronix.de>
---
drivers/video/fbdev/xen-fbfront.c | 8 +---
include/linux/console.h | 1 +
kernel/printk/printk.c | 69 +++++++++++++++++++------------
3 files changed, 46 insertions(+), 32 deletions(-)
diff --git a/drivers/video/fbdev/xen-fbfront.c b/drivers/video/fbdev/xen-fbfront.c
index 2552c853c6c2..aa362b25a60f 100644
--- a/drivers/video/fbdev/xen-fbfront.c
+++ b/drivers/video/fbdev/xen-fbfront.c
@@ -512,12 +512,8 @@ static void xenfb_make_preferred_console(void)
}
console_srcu_read_unlock(cookie);
- if (c) {
- unregister_console(c);
- c->flags |= CON_CONSDEV;
- c->flags &= ~CON_PRINTBUFFER; /* don't print again */
- register_console(c);
- }
+ if (c)
+ console_force_preferred(c);
}
static int xenfb_resume(struct xenbus_device *dev)
diff --git a/include/linux/console.h b/include/linux/console.h
index bf1e8136424a..41378b00bbdd 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -235,6 +235,7 @@ enum con_flush_mode {
};
extern int add_preferred_console(char *name, int idx, char *options);
+extern void console_force_preferred(struct console *c);
extern void register_console(struct console *);
extern int unregister_console(struct console *);
extern void console_lock(void);
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 840d581c4b23..9a056a42b8d8 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -3207,38 +3207,17 @@ static void try_enable_default_console(struct console *newcon)
static int unregister_console_locked(struct console *console);
-/*
- * The console driver calls this routine during kernel initialization
- * to register the console printing procedure with printk() and to
- * print any messages that were printed by the kernel before the
- * console driver was initialized.
- *
- * This can happen pretty early during the boot process (because of
- * early_printk) - sometimes before setup_arch() completes - be careful
- * of what kernel features are used - they may not be initialised yet.
- *
- * There are two types of consoles - bootconsoles (early_printk) and
- * "real" consoles (everything which is not a bootconsole) which are
- * handled differently.
- * - Any number of bootconsoles can be registered at any time.
- * - As soon as a "real" console is registered, all bootconsoles
- * will be unregistered automatically.
- * - Once a "real" console is registered, any attempt to register a
- * bootconsoles will be rejected
- */
-void register_console(struct console *newcon)
+static void register_console_locked(struct console *newcon)
{
struct console *con;
bool bootcon_enabled = false;
bool realcon_enabled = false;
int err;
- console_list_lock();
-
for_each_console(con) {
if (WARN(con == newcon, "console '%s%d' already registered\n",
con->name, con->index)) {
- goto unlock;
+ return;
}
if (con->flags & CON_BOOT)
@@ -3251,7 +3230,7 @@ void register_console(struct console *newcon)
if (newcon->flags & CON_BOOT && realcon_enabled) {
pr_info("Too late to register bootconsole %s%d\n",
newcon->name, newcon->index);
- goto unlock;
+ return;
}
/*
@@ -3282,7 +3261,7 @@ void register_console(struct console *newcon)
/* printk() messages are not printed to the Braille console. */
if (err || newcon->flags & CON_BRL)
- goto unlock;
+ return;
/*
* If we have a bootconsole, and are switching to a real console,
@@ -3346,7 +3325,31 @@ void register_console(struct console *newcon)
unregister_console_locked(con);
}
}
-unlock:
+}
+
+/*
+ * The console driver calls this routine during kernel initialization
+ * to register the console printing procedure with printk() and to
+ * print any messages that were printed by the kernel before the
+ * console driver was initialized.
+ *
+ * This can happen pretty early during the boot process (because of
+ * early_printk) - sometimes before setup_arch() completes - be careful
+ * of what kernel features are used - they may not be initialised yet.
+ *
+ * There are two types of consoles - bootconsoles (early_printk) and
+ * "real" consoles (everything which is not a bootconsole) which are
+ * handled differently.
+ * - Any number of bootconsoles can be registered at any time.
+ * - As soon as a "real" console is registered, all bootconsoles
+ * will be unregistered automatically.
+ * - Once a "real" console is registered, any attempt to register a
+ * bootconsoles will be rejected
+ */
+void register_console(struct console *newcon)
+{
+ console_list_lock();
+ register_console_locked(newcon);
console_list_unlock();
}
EXPORT_SYMBOL(register_console);
@@ -3411,6 +3414,20 @@ int unregister_console(struct console *console)
}
EXPORT_SYMBOL(unregister_console);
+void console_force_preferred(struct console *c)
+{
+ console_list_lock();
+
+ if (unregister_console_locked(c) == 0) {
+ c->flags |= CON_CONSDEV;
+ c->flags &= ~CON_PRINTBUFFER; /* don't print again */
+ register_console_locked(c);
+ }
+
+ console_list_unlock();
+}
+EXPORT_SYMBOL(console_force_preferred);
+
/*
* Initialize the console device. This is called *early*, so
* we can't necessarily depend on lots of kernel help here.
--
2.30.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH printk v2 24/38] xen: fbfront: use srcu console list iterator
2022-10-19 14:55 ` [PATCH printk v2 24/38] xen: fbfront: use srcu console list iterator John Ogness
@ 2022-10-25 13:39 ` Petr Mladek
0 siblings, 0 replies; 7+ messages in thread
From: Petr Mladek @ 2022-10-25 13:39 UTC (permalink / raw)
To: John Ogness
Cc: Sergey Senozhatsky, Steven Rostedt, Thomas Gleixner, linux-kernel,
Helge Deller, Thomas Zimmermann, Javier Martinez Canillas,
Boris Ostrovsky, Juergen Gross, Tom Rix, linux-fbdev, dri-devel
On Wed 2022-10-19 17:01:46, John Ogness wrote:
> Since the console_lock is not being used for anything other than
> safe console list traversal, use srcu console list iteration instead.
>
> Signed-off-by: John Ogness <john.ogness@linutronix.de>
Reviewed-by: Petr Mladek <pmladek@suse.com>
> ---
> drivers/video/fbdev/xen-fbfront.c | 8 +++++---
> 1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/video/fbdev/xen-fbfront.c b/drivers/video/fbdev/xen-fbfront.c
> index 4d2694d904aa..2552c853c6c2 100644
> --- a/drivers/video/fbdev/xen-fbfront.c
> +++ b/drivers/video/fbdev/xen-fbfront.c
> @@ -500,16 +500,18 @@ static int xenfb_probe(struct xenbus_device *dev,
> static void xenfb_make_preferred_console(void)
Just for record. This function is a dirty hack how to associate "ttyX"
console with /dev/console.
A clean solution would be to just reshuffle console_drivers list. I
have a patch for this in my bottom drawer. It is part of a bigger
clean up that it not ready for upstreaming yet.
Best Regards,
Petr
> {
> struct console *c;
> + int cookie;
>
> if (console_set_on_cmdline)
> return;
>
> - console_lock();
> - for_each_console(c) {
> + cookie = console_srcu_read_lock();
> + for_each_console_srcu(c) {
> if (!strcmp(c->name, "tty") && c->index == 0)
> break;
> }
> - console_unlock();
> + console_srcu_read_unlock(cookie);
> +
> if (c) {
> unregister_console(c);
> c->flags |= CON_CONSDEV;
> --
> 2.30.2
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH printk v2 38/38] printk, xen: fbfront: create/use safe function for forcing preferred
2022-10-19 14:56 ` [PATCH printk v2 38/38] printk, xen: fbfront: create/use safe function for forcing preferred John Ogness
@ 2022-10-27 13:18 ` Petr Mladek
2022-10-27 13:35 ` John Ogness
0 siblings, 1 reply; 7+ messages in thread
From: Petr Mladek @ 2022-10-27 13:18 UTC (permalink / raw)
To: John Ogness
Cc: Sergey Senozhatsky, Steven Rostedt, Thomas Gleixner, linux-kernel,
Helge Deller, Greg Kroah-Hartman, Javier Martinez Canillas,
Thomas Zimmermann, Juergen Gross, Boris Ostrovsky, Tom Rix,
linux-fbdev, dri-devel
On Wed 2022-10-19 17:02:00, John Ogness wrote:
> With commit 9e124fe16ff2("xen: Enable console tty by default in domU
> if it's not a dummy") a hack was implemented to make sure that the
> tty console remains the console behind the /dev/console device. The
> main problem with the hack is that, after getting the console pointer
> to the tty console, it is assumed the pointer is still valid after
> releasing the console_sem. This assumption is incorrect and unsafe.
>
> Make the hack safe by introducing a new function
> console_force_preferred() to perform the full operation under
> the console_list_lock.
>
> Signed-off-by: John Ogness <john.ogness@linutronix.de>
> ---
> drivers/video/fbdev/xen-fbfront.c | 8 +---
> include/linux/console.h | 1 +
> kernel/printk/printk.c | 69 +++++++++++++++++++------------
> 3 files changed, 46 insertions(+), 32 deletions(-)
>
> diff --git a/drivers/video/fbdev/xen-fbfront.c b/drivers/video/fbdev/xen-fbfront.c
> index 2552c853c6c2..aa362b25a60f 100644
> --- a/drivers/video/fbdev/xen-fbfront.c
> +++ b/drivers/video/fbdev/xen-fbfront.c
> @@ -512,12 +512,8 @@ static void xenfb_make_preferred_console(void)
> }
> console_srcu_read_unlock(cookie);
>
> - if (c) {
> - unregister_console(c);
> - c->flags |= CON_CONSDEV;
> - c->flags &= ~CON_PRINTBUFFER; /* don't print again */
> - register_console(c);
> - }
> + if (c)
> + console_force_preferred(c);
I would prefer to fix this a clean way. The current code is a real hack.
It tries to find a console under console_srcu. Then the console
is unregistered, flags are modified, and gets registered again.
The locks are released between all these operations.
I would suggest to implement:
void console_force_preferred_locked(struct console *new_pref_con)
{
struct console *cur_pref_con;
assert_console_list_lock_held();
if (hlist_unhashed(&new_pref_con->node))
return;
for_each_console(cur_pref_con) {
if (cur_pref_con->flags & CON_CONSDEV)
break;
}
/* Already preferred? */
if (cur_pref_con == new_pref_con)
return;
hlist_del_init_rcu(&new_pref_con->node);
/*
* Ensure that all SRCU list walks have completed before @con
* is added back as the first console
*/
synchronize_srcu()
hlist_add_behind_rcu(&new_pref_con->node, console_list.first);
cur_pref_con->flags &= ~CON_CONSDEV;
new_pref_con->flags |= CON_CONSDEV;
}
And do:
static void xenfb_make_preferred_console(void)
{
struct console *c;
if (console_set_on_cmdline)
return;
console_list_lock();
for_each_console(c) {
if (!strcmp(c->name, "tty") && c->index == 0)
break;
}
if (c)
console_force_preferred_locked(c);
console_list_unlock();
}
It is a more code. But it is race-free. Also it is much more clear
what is going on.
How does this sound, please?
Best Regards,
Petr
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH printk v2 38/38] printk, xen: fbfront: create/use safe function for forcing preferred
2022-10-27 13:18 ` Petr Mladek
@ 2022-10-27 13:35 ` John Ogness
2022-10-27 14:27 ` Petr Mladek
0 siblings, 1 reply; 7+ messages in thread
From: John Ogness @ 2022-10-27 13:35 UTC (permalink / raw)
To: Petr Mladek
Cc: Sergey Senozhatsky, Steven Rostedt, Thomas Gleixner, linux-kernel,
Helge Deller, Greg Kroah-Hartman, Javier Martinez Canillas,
Thomas Zimmermann, Juergen Gross, Boris Ostrovsky, Tom Rix,
linux-fbdev, dri-devel
On 2022-10-27, Petr Mladek <pmladek@suse.com> wrote:
>> - if (c) {
>> - unregister_console(c);
>> - c->flags |= CON_CONSDEV;
>> - c->flags &= ~CON_PRINTBUFFER; /* don't print again */
>> - register_console(c);
>> - }
>> + if (c)
>> + console_force_preferred(c);
>
> I would prefer to fix this a clean way.
>
> [...]
>
> I would suggest to implement:
>
> [...]
>
> It is a more code. But it is race-free. Also it is much more clear
> what is going on.
>
> How does this sound, please?
I wasn't sure if any of the other preferred-console magic in
register_console() was needed, which is why I kept a full
register_console() call. But if it really is just about forcing it the
head and setting a new CON_CONSDEV, then your suggestion is much
simpler. Thanks.
John
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH printk v2 38/38] printk, xen: fbfront: create/use safe function for forcing preferred
2022-10-27 13:35 ` John Ogness
@ 2022-10-27 14:27 ` Petr Mladek
0 siblings, 0 replies; 7+ messages in thread
From: Petr Mladek @ 2022-10-27 14:27 UTC (permalink / raw)
To: John Ogness
Cc: Sergey Senozhatsky, Steven Rostedt, Thomas Gleixner, linux-kernel,
Helge Deller, Greg Kroah-Hartman, Javier Martinez Canillas,
Thomas Zimmermann, Juergen Gross, Boris Ostrovsky, Tom Rix,
linux-fbdev, dri-devel
On Thu 2022-10-27 15:41:23, John Ogness wrote:
> On 2022-10-27, Petr Mladek <pmladek@suse.com> wrote:
> >> - if (c) {
> >> - unregister_console(c);
> >> - c->flags |= CON_CONSDEV;
> >> - c->flags &= ~CON_PRINTBUFFER; /* don't print again */
> >> - register_console(c);
> >> - }
> >> + if (c)
> >> + console_force_preferred(c);
> >
> > I would prefer to fix this a clean way.
> >
> > [...]
> >
> > I would suggest to implement:
> >
> > [...]
> >
> > It is a more code. But it is race-free. Also it is much more clear
> > what is going on.
> >
> > How does this sound, please?
>
> I wasn't sure if any of the other preferred-console magic in
> register_console() was needed, which is why I kept a full
> register_console() call. But if it really is just about forcing it the
> head and setting a new CON_CONSDEV, then your suggestion is much
> simpler. Thanks.
I believe that it is just this. I have spent a lot of time
investigating these hacks when thinking about refactoring
of register_console().
Best Regards,
Petr
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-10-27 14:27 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-19 14:55 [PATCH printk v2 00/38] reduce console_lock scope John Ogness
2022-10-19 14:55 ` [PATCH printk v2 24/38] xen: fbfront: use srcu console list iterator John Ogness
2022-10-25 13:39 ` Petr Mladek
2022-10-19 14:56 ` [PATCH printk v2 38/38] printk, xen: fbfront: create/use safe function for forcing preferred John Ogness
2022-10-27 13:18 ` Petr Mladek
2022-10-27 13:35 ` John Ogness
2022-10-27 14:27 ` Petr Mladek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).