Messages in this thread Patch in this message | | | From | Sergey Senozhatsky <> | Subject | [RFC][PATCH 2/2] printk: take console_sem when accessing console drivers list | Date | Tue, 23 Apr 2019 15:25:11 +0900 |
| |
We need to take console_sem lock when we iterate console drivers list. Otherwise, another CPU can concurrently modify console drivers list or console drivers.
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com> --- kernel/printk/printk.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index b0e361ca1bea..c2bccf58d03e 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -2674,12 +2674,17 @@ void register_console(struct console *newcon) struct console_cmdline *c; static bool has_preferred; - if (console_drivers) - for_each_console(bcon) - if (WARN(bcon == newcon, - "console '%s%d' already registered\n", - bcon->name, bcon->index)) - return; + console_lock(); + if (console_drivers) { + for_each_console(bcon) { + if (bcon != newcon) + continue; + WARN(1, "console '%s%d' already registered\n", + bcon->name, bcon->index); + console_unlock(); + return; + } + } /* * before we register a new CON_BOOT console, make sure we don't @@ -2691,6 +2696,7 @@ void register_console(struct console *newcon) if (!(bcon->flags & CON_BOOT)) { pr_info("Too late to register bootconsole %s%d\n", newcon->name, newcon->index); + console_unlock(); return; } } @@ -2701,6 +2707,7 @@ void register_console(struct console *newcon) if (!has_preferred || bcon || !console_drivers) has_preferred = preferred_console >= 0; + console_unlock(); /* * See if we want to use this console driver. If we -- 2.21.0
| |