* [PATCH v2 1/9] printk: Rename struct console_cmdline to preferred_console
2026-04-23 13:00 [PATCH v2 0/9] printk: Clean up preferred console handling Petr Mladek
@ 2026-04-23 13:00 ` Petr Mladek
2026-04-23 14:16 ` Steven Rostedt
2026-04-23 13:00 ` [PATCH v2 2/9] printk: Rename preferred_console to preferred_dev_console Petr Mladek
` (7 subsequent siblings)
8 siblings, 1 reply; 11+ messages in thread
From: Petr Mladek @ 2026-04-23 13:00 UTC (permalink / raw)
To: John Ogness
Cc: Sergey Senozhatsky, Steven Rostedt, Marcos Paulo de Souza,
Chris Down, linux-kernel, Petr Mladek
The structure 'console_cmdline' was originally intended to store details
about consoles defined on the kernel command line. However, its usage
has since expanded; it now stores information for consoles preferred
via SPCR, device tree, or by particular platforms, e.g. XEN.
The current naming is misleading as it implies the configuration only
originates from the command line.
Rename the structure and associated artifacts to better reflect their
current purpose, for example:
- struct console_cmdline c -> struct preferred_console pc
- console_cmdline[] -> preferred_consoles[]
- console_cmdline.h -> console_register.h
- c -> pc
Additionally, renaming the header file to console_register.h would
eventually allow to decouple console registration logic from
the monolithic printk.c.
Finally, renaming the local variable from "c" to "pc" helps to distinguish
it from struct console variables. Note that "c" is used for struct console
in some code, for example see vt_console_device() function definition.
The patch should not change the existing behaivor.
Signed-off-by: Petr Mladek <pmladek@suse.com>
Acked-by: Chris Down <chris@chrisdown.name>
Acked-by: Marcos Paulo de Souza <mpdesouza@suse.com>
---
kernel/printk/braille.c | 10 +--
kernel/printk/braille.h | 10 +--
.../{console_cmdline.h => console_register.h} | 6 +-
kernel/printk/printk.c | 86 ++++++++++---------
4 files changed, 57 insertions(+), 55 deletions(-)
rename kernel/printk/{console_cmdline.h => console_register.h} (83%)
diff --git a/kernel/printk/braille.c b/kernel/printk/braille.c
index 17a9591e54ff..9d21a2bb1d38 100644
--- a/kernel/printk/braille.c
+++ b/kernel/printk/braille.c
@@ -6,7 +6,7 @@
#include <linux/errno.h>
#include <linux/string.h>
-#include "console_cmdline.h"
+#include "console_register.h"
#include "braille.h"
int _braille_console_setup(char **str, char **brl_options)
@@ -35,14 +35,14 @@ int _braille_console_setup(char **str, char **brl_options)
}
int
-_braille_register_console(struct console *console, struct console_cmdline *c)
+_braille_register_console(struct console *console, struct preferred_console *pc)
{
int rtn = 0;
- if (c->brl_options) {
+ if (pc->brl_options) {
console->flags |= CON_BRL;
- rtn = braille_register_console(console, c->index, c->options,
- c->brl_options);
+ rtn = braille_register_console(console, pc->index, pc->options,
+ pc->brl_options);
}
return rtn;
diff --git a/kernel/printk/braille.h b/kernel/printk/braille.h
index 123154f86304..55cd3178a17a 100644
--- a/kernel/printk/braille.h
+++ b/kernel/printk/braille.h
@@ -5,9 +5,9 @@
#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
static inline void
-braille_set_options(struct console_cmdline *c, char *brl_options)
+braille_set_options(struct preferred_console *pc, char *brl_options)
{
- c->brl_options = brl_options;
+ pc->brl_options = brl_options;
}
/*
@@ -21,7 +21,7 @@ int
_braille_console_setup(char **str, char **brl_options);
int
-_braille_register_console(struct console *console, struct console_cmdline *c);
+_braille_register_console(struct console *console, struct preferred_console *pc);
int
_braille_unregister_console(struct console *console);
@@ -29,7 +29,7 @@ _braille_unregister_console(struct console *console);
#else
static inline void
-braille_set_options(struct console_cmdline *c, char *brl_options)
+braille_set_options(struct preferred_console *pc, char *brl_options)
{
}
@@ -40,7 +40,7 @@ _braille_console_setup(char **str, char **brl_options)
}
static inline int
-_braille_register_console(struct console *console, struct console_cmdline *c)
+_braille_register_console(struct console *console, struct preferred_console *pc)
{
return 0;
}
diff --git a/kernel/printk/console_cmdline.h b/kernel/printk/console_register.h
similarity index 83%
rename from kernel/printk/console_cmdline.h
rename to kernel/printk/console_register.h
index 0ab573b6d4dc..9ab3e1cc749b 100644
--- a/kernel/printk/console_cmdline.h
+++ b/kernel/printk/console_register.h
@@ -1,8 +1,8 @@
/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef _CONSOLE_CMDLINE_H
-#define _CONSOLE_CMDLINE_H
+#ifndef _CONSOLE_REGISTER_H
+#define _CONSOLE_REGISTER_H
-struct console_cmdline
+struct preferred_console
{
char name[16]; /* Name of the driver */
int index; /* Minor dev. to use */
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 0323149548f6..ca523acbf58d 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -58,7 +58,7 @@
#include <trace/events/printk.h>
#include "printk_ringbuffer.h"
-#include "console_cmdline.h"
+#include "console_register.h"
#include "braille.h"
#include "internal.h"
@@ -362,9 +362,9 @@ static int console_locked;
* Array of consoles built from command line options (console=)
*/
-#define MAX_CMDLINECONSOLES 8
+#define MAX_PREFERRED_CONSOLES 8
-static struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES];
+static struct preferred_console preferred_consoles[MAX_PREFERRED_CONSOLES];
static int preferred_console = -1;
int console_set_on_cmdline;
@@ -2544,16 +2544,16 @@ asmlinkage __visible void early_printk(const char *fmt, ...)
}
#endif
-static void set_user_specified(struct console_cmdline *c, bool user_specified)
+static void set_user_specified(struct preferred_console *pc, bool user_specified)
{
if (!user_specified)
return;
/*
- * @c console was defined by the user on the command line.
+ * @pc console was defined by the user on the command line.
* Do not clear when added twice also by SPCR or the device tree.
*/
- c->user_specified = true;
+ pc->user_specified = true;
/* At least one console defined by the user on the command line. */
console_set_on_cmdline = 1;
}
@@ -2562,7 +2562,7 @@ static int __add_preferred_console(const char *name, const short idx,
const char *devname, char *options,
char *brl_options, bool user_specified)
{
- struct console_cmdline *c;
+ struct preferred_console *pc;
int i;
if (!name && !devname)
@@ -2581,30 +2581,30 @@ static int __add_preferred_console(const char *name, const short idx,
* See if this tty is not yet registered, and
* if we have a slot free.
*/
- for (i = 0, c = console_cmdline;
- i < MAX_CMDLINECONSOLES && (c->name[0] || c->devname[0]);
- i++, c++) {
- if ((name && strcmp(c->name, name) == 0 && c->index == idx) ||
- (devname && strcmp(c->devname, devname) == 0)) {
+ for (i = 0, pc = preferred_consoles;
+ i < MAX_PREFERRED_CONSOLES && (pc->name[0] || pc->devname[0]);
+ i++, pc++) {
+ if ((name && strcmp(pc->name, name) == 0 && pc->index == idx) ||
+ (devname && strcmp(pc->devname, devname) == 0)) {
if (!brl_options)
preferred_console = i;
- set_user_specified(c, user_specified);
+ set_user_specified(pc, user_specified);
return 0;
}
}
- if (i == MAX_CMDLINECONSOLES)
+ if (i == MAX_PREFERRED_CONSOLES)
return -E2BIG;
if (!brl_options)
preferred_console = i;
if (name)
- strscpy(c->name, name);
+ strscpy(pc->name, name);
if (devname)
- strscpy(c->devname, devname);
- c->options = options;
- set_user_specified(c, user_specified);
- braille_set_options(c, brl_options);
+ strscpy(pc->devname, devname);
+ pc->options = options;
+ set_user_specified(pc, user_specified);
+ braille_set_options(pc, brl_options);
- c->index = idx;
+ pc->index = idx;
return 0;
}
@@ -2624,8 +2624,10 @@ __setup("console_msg_format=", console_msg_format_setup);
*/
static int __init console_setup(char *str)
{
- static_assert(sizeof(console_cmdline[0].devname) >= sizeof(console_cmdline[0].name) + 4);
- char buf[sizeof(console_cmdline[0].devname)];
+ static_assert(sizeof(preferred_consoles[0].devname) >=
+ sizeof(preferred_consoles[0].name) + 4);
+
+ char buf[sizeof(preferred_consoles[0].devname)];
char *brl_options = NULL;
char *ttyname = NULL;
char *devname = NULL;
@@ -2730,19 +2732,19 @@ int match_devname_and_update_preferred_console(const char *devname,
const char *name,
const short idx)
{
- struct console_cmdline *c = console_cmdline;
+ struct preferred_console *pc = preferred_consoles;
int i;
if (!devname || !strlen(devname) || !name || !strlen(name) || idx < 0)
return -EINVAL;
- for (i = 0; i < MAX_CMDLINECONSOLES && (c->name[0] || c->devname[0]);
- i++, c++) {
- if (!strcmp(devname, c->devname)) {
+ for (i = 0; i < MAX_PREFERRED_CONSOLES && (pc->name[0] || pc->devname[0]);
+ i++, pc++) {
+ if (!strcmp(devname, pc->devname)) {
pr_info("associate the preferred console \"%s\" with \"%s%d\"\n",
devname, name, idx);
- strscpy(c->name, name);
- c->index = idx;
+ strscpy(pc->name, name);
+ pc->index = idx;
return 0;
}
}
@@ -3897,33 +3899,33 @@ static int console_call_setup(struct console *newcon, char *options)
static int try_enable_preferred_console(struct console *newcon,
bool user_specified)
{
- struct console_cmdline *c;
+ struct preferred_console *pc;
int i, err;
- for (i = 0, c = console_cmdline;
- i < MAX_CMDLINECONSOLES && (c->name[0] || c->devname[0]);
- i++, c++) {
+ for (i = 0, pc = preferred_consoles;
+ i < MAX_PREFERRED_CONSOLES && (pc->name[0] || pc->devname[0]);
+ i++, pc++) {
/* Console not yet initialized? */
- if (!c->name[0])
+ if (!pc->name[0])
continue;
- if (c->user_specified != user_specified)
+ if (pc->user_specified != user_specified)
continue;
if (!newcon->match ||
- newcon->match(newcon, c->name, c->index, c->options) != 0) {
+ newcon->match(newcon, pc->name, pc->index, pc->options) != 0) {
/* default matching */
- BUILD_BUG_ON(sizeof(c->name) != sizeof(newcon->name));
- if (strcmp(c->name, newcon->name) != 0)
+ BUILD_BUG_ON(sizeof(pc->name) != sizeof(newcon->name));
+ if (strcmp(pc->name, newcon->name) != 0)
continue;
if (newcon->index >= 0 &&
- newcon->index != c->index)
+ newcon->index != pc->index)
continue;
if (newcon->index < 0)
- newcon->index = c->index;
+ newcon->index = pc->index;
- if (_braille_register_console(newcon, c))
+ if (_braille_register_console(newcon, pc))
return 0;
- err = console_call_setup(newcon, c->options);
+ err = console_call_setup(newcon, pc->options);
if (err)
return err;
}
@@ -3938,7 +3940,7 @@ static int try_enable_preferred_console(struct console *newcon,
* without matching. Accept the pre-enabled consoles only when match()
* and setup() had a chance to be called.
*/
- if (newcon->flags & CON_ENABLED && c->user_specified == user_specified)
+ if (newcon->flags & CON_ENABLED && pc->user_specified == user_specified)
return 0;
return -ENOENT;
--
2.53.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [PATCH v2 1/9] printk: Rename struct console_cmdline to preferred_console
2026-04-23 13:00 ` [PATCH v2 1/9] printk: Rename struct console_cmdline to preferred_console Petr Mladek
@ 2026-04-23 14:16 ` Steven Rostedt
0 siblings, 0 replies; 11+ messages in thread
From: Steven Rostedt @ 2026-04-23 14:16 UTC (permalink / raw)
To: Petr Mladek
Cc: John Ogness, Sergey Senozhatsky, Marcos Paulo de Souza,
Chris Down, linux-kernel
On Thu, 23 Apr 2026 15:00:06 +0200
Petr Mladek <pmladek@suse.com> wrote:
> The structure 'console_cmdline' was originally intended to store details
> about consoles defined on the kernel command line. However, its usage
> has since expanded; it now stores information for consoles preferred
> via SPCR, device tree, or by particular platforms, e.g. XEN.
>
> The current naming is misleading as it implies the configuration only
> originates from the command line.
>
> Rename the structure and associated artifacts to better reflect their
> current purpose, for example:
>
> - struct console_cmdline c -> struct preferred_console pc
> - console_cmdline[] -> preferred_consoles[]
> - console_cmdline.h -> console_register.h
> - c -> pc
Nice.
>
> Additionally, renaming the header file to console_register.h would
> eventually allow to decouple console registration logic from
> the monolithic printk.c.
>
> Finally, renaming the local variable from "c" to "pc" helps to distinguish
> it from struct console variables. Note that "c" is used for struct console
> in some code, for example see vt_console_device() function definition.
>
> The patch should not change the existing behaivor.
I believe the phrase is: "No functional changes" ;-)
>
> Signed-off-by: Petr Mladek <pmladek@suse.com>
> Acked-by: Chris Down <chris@chrisdown.name>
> Acked-by: Marcos Paulo de Souza <mpdesouza@suse.com>
> ---
> @@ -2624,8 +2624,10 @@ __setup("console_msg_format=", console_msg_format_setup);
> */
> static int __init console_setup(char *str)
> {
> - static_assert(sizeof(console_cmdline[0].devname) >= sizeof(console_cmdline[0].name) + 4);
> - char buf[sizeof(console_cmdline[0].devname)];
> + static_assert(sizeof(preferred_consoles[0].devname) >=
> + sizeof(preferred_consoles[0].name) + 4);
Hmm with the line break and you adding a space before the declarations; If
this is going to change, might as well move it below the declarations as it
is a compile time check, and the order doesn't matter.
> +
> + char buf[sizeof(preferred_consoles[0].devname)];
> char *brl_options = NULL;
> char *ttyname = NULL;
> char *devname = NULL;
-- Steve
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v2 2/9] printk: Rename preferred_console to preferred_dev_console
2026-04-23 13:00 [PATCH v2 0/9] printk: Clean up preferred console handling Petr Mladek
2026-04-23 13:00 ` [PATCH v2 1/9] printk: Rename struct console_cmdline to preferred_console Petr Mladek
@ 2026-04-23 13:00 ` Petr Mladek
2026-04-23 13:00 ` [PATCH v2 3/9] printk: Separate code for adding/updating preferred console metadata Petr Mladek
` (6 subsequent siblings)
8 siblings, 0 replies; 11+ messages in thread
From: Petr Mladek @ 2026-04-23 13:00 UTC (permalink / raw)
To: John Ogness
Cc: Sergey Senozhatsky, Steven Rostedt, Marcos Paulo de Souza,
Chris Down, linux-kernel, Petr Mladek
The preferred_consoles[] array stores information about consoles requested
via the command line, SPCR, Device Tree, or platform-specific code.
Within this array, the 'preferred_console' variable tracks the specific
index that should be associated with /dev/console (typically the last
non-braille console defined).
The current name "preferred_console" is ambiguous and leads to confusion.
It does not clearly communicate why one console is "more preferred" than
others in the array. Furthermore, entries for Braille consoles can exist
within the preferred_consoles[] array, yet they are never associated with
/dev/console and do not receive standard printk() output. Consequently,
the 'preferred_console' index must skip these entries, which is not
immediately obvious from the name.
Rename the variable to 'preferred_dev_console' to explicitly clarify its
role in identifying which entry is linked to /dev/console.
The patch should not change the existing behavior.
Signed-off-by: Petr Mladek <pmladek@suse.com>
Acked-by: Chris Down <chris@chrisdown.name>
Acked-by: Marcos Paulo de Souza <mpdesouza@suse.com>
---
kernel/printk/printk.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index ca523acbf58d..13c98285892b 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -366,7 +366,7 @@ static int console_locked;
static struct preferred_console preferred_consoles[MAX_PREFERRED_CONSOLES];
-static int preferred_console = -1;
+static int preferred_dev_console = -1;
int console_set_on_cmdline;
EXPORT_SYMBOL(console_set_on_cmdline);
@@ -2587,7 +2587,7 @@ static int __add_preferred_console(const char *name, const short idx,
if ((name && strcmp(pc->name, name) == 0 && pc->index == idx) ||
(devname && strcmp(pc->devname, devname) == 0)) {
if (!brl_options)
- preferred_console = i;
+ preferred_dev_console = i;
set_user_specified(pc, user_specified);
return 0;
}
@@ -2595,7 +2595,7 @@ static int __add_preferred_console(const char *name, const short idx,
if (i == MAX_PREFERRED_CONSOLES)
return -E2BIG;
if (!brl_options)
- preferred_console = i;
+ preferred_dev_console = i;
if (name)
strscpy(pc->name, name);
if (devname)
@@ -3930,7 +3930,7 @@ static int try_enable_preferred_console(struct console *newcon,
return err;
}
newcon->flags |= CON_ENABLED;
- if (i == preferred_console)
+ if (i == preferred_dev_console)
newcon->flags |= CON_CONSDEV;
return 0;
}
@@ -4111,7 +4111,7 @@ void register_console(struct console *newcon)
* Note that a console with tty binding will have CON_CONSDEV
* flag set and will be first in the list.
*/
- if (preferred_console < 0) {
+ if (preferred_dev_console < 0) {
if (hlist_empty(&console_list) || !console_first()->device ||
console_first()->flags & CON_BOOT) {
try_enable_default_console(newcon);
--
2.53.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v2 3/9] printk: Separate code for adding/updating preferred console metadata
2026-04-23 13:00 [PATCH v2 0/9] printk: Clean up preferred console handling Petr Mladek
2026-04-23 13:00 ` [PATCH v2 1/9] printk: Rename struct console_cmdline to preferred_console Petr Mladek
2026-04-23 13:00 ` [PATCH v2 2/9] printk: Rename preferred_console to preferred_dev_console Petr Mladek
@ 2026-04-23 13:00 ` Petr Mladek
2026-04-23 13:00 ` [PATCH v2 4/9] printk: Cleanup _braille_(un)register_console() wrappers Petr Mladek
` (5 subsequent siblings)
8 siblings, 0 replies; 11+ messages in thread
From: Petr Mladek @ 2026-04-23 13:00 UTC (permalink / raw)
To: John Ogness
Cc: Sergey Senozhatsky, Steven Rostedt, Marcos Paulo de Souza,
Chris Down, linux-kernel, Petr Mladek
The logic for adding or updating a preferred console is currently
duplicated within __add_preferred_console(), making the code difficult
to follow and prone to consistency issues.
Introduce update_preferred_console() to centralize the initialization
and updating of struct preferred_console entries. This refactoring
explicitly defines and enforces the following rules:
1. Console names and/or indexes are not set when a console is preferred
via devname; these are resolved later during device matching.
2. Console names are only added alongside a valid index.
3. Only matching entries are updated.
4. Console and Braille options are never cleared. They are updated
only via the command line.
5. The global 'preferred_dev_console' index and 'console_set_on_cmdline'
flag are updated consistently.
Additionally, rename braille_set_options() to braille_update_options()
to better reflect its conditional behavior.
Behavior change:
The original code never updated the preferred console options
when it was preferred more times, e.g. via the command line
and/or some platform specific code, e.g. SPCR or device tree.
The new code explicitly allows to update the console options
when they are preferred over the command line.
It mostly worked even before but only because the command line was
processed early enough before handling SPCR, device tree, or other
platform specific init code.
The main behavior change is when the same console is preferred more
times on the command line. Newly, the later or Braille variant
wins. It is a more common and expected behavior.
Signed-off-by: Petr Mladek <pmladek@suse.com>
---
kernel/printk/braille.h | 7 +-
kernel/printk/printk.c | 149 ++++++++++++++++++++++++++++++----------
2 files changed, 118 insertions(+), 38 deletions(-)
diff --git a/kernel/printk/braille.h b/kernel/printk/braille.h
index 55cd3178a17a..0bdac303f8b1 100644
--- a/kernel/printk/braille.h
+++ b/kernel/printk/braille.h
@@ -5,9 +5,10 @@
#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
static inline void
-braille_set_options(struct preferred_console *pc, char *brl_options)
+braille_update_options(struct preferred_console *pc, char *brl_options)
{
- pc->brl_options = brl_options;
+ if (brl_options)
+ pc->brl_options = brl_options;
}
/*
@@ -29,7 +30,7 @@ _braille_unregister_console(struct console *console);
#else
static inline void
-braille_set_options(struct preferred_console *pc, char *brl_options)
+braille_update_options(struct preferred_console *pc, char *brl_options)
{
}
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 13c98285892b..d251bf8e104f 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2544,18 +2544,119 @@ asmlinkage __visible void early_printk(const char *fmt, ...)
}
#endif
-static void set_user_specified(struct preferred_console *pc, bool user_specified)
+/** update_preferred_console - Update a given entry in the preferred_consoles[]
+ * table.
+ * @i: index of the entry in @preferred_consoles table which should get updated.
+ * @name: The name of the preferred console driver.
+ * @idx: Preferred console index, e.g. port number.
+ * @devname: The name of the preferred physical device.
+ * @options: Options used when setting up the console driver.
+ * @brl_options: Options used when setting up the console driver
+ * as a braille console.
+ * @user_specified: True if preferred via the kernel command line.
+ *
+ * The function ensures that the given values are consistent. Also
+ * it updates some global variables which are used to make the right
+ * decisions in register_console().
+ *
+ * Rules:
+ *
+ * 1. Either @name and valid @idx OR @devname and @idx=-1 are allowed.
+ * Note that a valid @name and @idx will get assigned later when
+ * @devname matches during the device initialization.
+ * 2. Specify @brl_options if the console should be enabled as
+ * a Braille console [*]
+ * 3. Only matching entries can be updated.
+ * 4. @options passed via the command line are used when the same
+ * console is preferred also by some platform-specific code.
+ *
+ * [*] Braille console is using the mechanism for registering consoles
+ * but it is very special. It is primarily used for user interaction
+ * with the system. It neither gets printk() messages nor is associated
+ * with /dev/console.
+ */
+static int update_preferred_console(unsigned int i,
+ const char *name, const short idx,
+ const char *devname, char *options,
+ char *brl_options, bool user_specified)
{
- if (!user_specified)
- return;
+ struct preferred_console *pc;
+
+ if (i >= MAX_PREFERRED_CONSOLES)
+ return -E2BIG;
+
+ pc = &preferred_consoles[i];
+
+ if (!name && !devname)
+ return -EINVAL;
+
+ if (devname) {
+ /*
+ * A valid console name and index will get assigned when
+ * a matching device gets registered.
+ */
+ if (name) {
+ pr_err("Adding a preferred console devname with a hard-coded console name: %s, %s\n",
+ devname, name);
+ return -EINVAL;
+ }
+ if (pc->name[0]) {
+ pr_err("Updating a preferred console entry with an already assigned console name via devname: %s, %s\n",
+ devname, pc->name);
+ return -EINVAL;
+ }
+ if (idx != -1) {
+ pr_err("Adding a preferred console devname with a hard-coded index: %s, %d\n",
+ devname, idx);
+ return -EINVAL;
+ }
+
+ if (!pc->devname[0]) {
+ strscpy(pc->devname, devname);
+ pc->index = idx;
+ } else if (strcmp(pc->devname, devname) != 0) {
+ pr_err("Updating a preferred console with an invalid devname: %s vs. %s\n",
+ pc->devname, devname);
+ return -EINVAL;
+ }
+ }
+
+ if (name) {
+ /* A console name must be defined with a valid index. */
+ if (idx < 0) {
+ pr_err("Adding a preferred console with an invalid index: %s, %d\n",
+ name, idx);
+ return -EINVAL;
+ }
+
+ if (!pc->name[0]) {
+ strscpy(pc->name, name);
+ pc->index = idx;
+ } else if (strcmp(pc->name, name) != 0 || pc->index != idx) {
+ pr_err("Updating a preferred console with an invalid name or index: %s%d vs. %s%d\n",
+ pc->name, pc->index, name, idx);
+ return -EINVAL;
+ }
+ }
+
+ if (!pc->options || (user_specified && options))
+ pc->options = options;
+
+ braille_update_options(pc, brl_options);
+
+ if (!brl_options)
+ preferred_dev_console = i;
/*
* @pc console was defined by the user on the command line.
* Do not clear when added twice also by SPCR or the device tree.
*/
- pc->user_specified = true;
- /* At least one console defined by the user on the command line. */
- console_set_on_cmdline = 1;
+ if (user_specified) {
+ pc->user_specified = true;
+ console_set_on_cmdline = 1;
+ }
+
+ return 0;
}
static int __add_preferred_console(const char *name, const short idx,
@@ -2563,19 +2664,11 @@ static int __add_preferred_console(const char *name, const short idx,
char *brl_options, bool user_specified)
{
struct preferred_console *pc;
- int i;
+ unsigned int i;
if (!name && !devname)
return -EINVAL;
- /*
- * We use a signed short index for struct console for device drivers to
- * indicate a not yet assigned index or port. However, a negative index
- * value is not valid when the console name and index are defined on
- * the command line.
- */
- if (name && idx < 0)
- return -EINVAL;
/*
* See if this tty is not yet registered, and
@@ -2584,28 +2677,14 @@ static int __add_preferred_console(const char *name, const short idx,
for (i = 0, pc = preferred_consoles;
i < MAX_PREFERRED_CONSOLES && (pc->name[0] || pc->devname[0]);
i++, pc++) {
- if ((name && strcmp(pc->name, name) == 0 && pc->index == idx) ||
- (devname && strcmp(pc->devname, devname) == 0)) {
- if (!brl_options)
- preferred_dev_console = i;
- set_user_specified(pc, user_specified);
- return 0;
- }
+ if (name && strcmp(pc->name, name) == 0 && pc->index == idx)
+ break;
+ if (devname && strcmp(pc->devname, devname) == 0)
+ break;
}
- if (i == MAX_PREFERRED_CONSOLES)
- return -E2BIG;
- if (!brl_options)
- preferred_dev_console = i;
- if (name)
- strscpy(pc->name, name);
- if (devname)
- strscpy(pc->devname, devname);
- pc->options = options;
- set_user_specified(pc, user_specified);
- braille_set_options(pc, brl_options);
- pc->index = idx;
- return 0;
+ return update_preferred_console(i, name, idx, devname, options,
+ brl_options, user_specified);
}
static int __init console_msg_format_setup(char *str)
--
2.53.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v2 4/9] printk: Cleanup _braille_(un)register_console() wrappers
2026-04-23 13:00 [PATCH v2 0/9] printk: Clean up preferred console handling Petr Mladek
` (2 preceding siblings ...)
2026-04-23 13:00 ` [PATCH v2 3/9] printk: Separate code for adding/updating preferred console metadata Petr Mladek
@ 2026-04-23 13:00 ` Petr Mladek
2026-04-23 13:00 ` [PATCH v2 5/9] printk: Separate code for enabling console Petr Mladek
` (4 subsequent siblings)
8 siblings, 0 replies; 11+ messages in thread
From: Petr Mladek @ 2026-04-23 13:00 UTC (permalink / raw)
To: John Ogness
Cc: Sergey Senozhatsky, Steven Rostedt, Marcos Paulo de Souza,
Chris Down, linux-kernel, Petr Mladek
The _braille_(un)register_console() wrappers currently attempt to hide
implementation details like the CON_BRL flag and pc->brl_options. This
forces callers to handle an unconventional tri-state return value (0 for
NOP, >0 for success, <0 for error), which makes the control flow harder
to follow and non-standard.
Refactor the wrappers to use standard kernel return codes (0 for success,
-ERRCODE on failure). Move the responsibility of checking brl_options
to the caller to make the logic more explicit.
Additionally, move the assignment of the CON_BRL flag from the internal
wrapper to braille_register_console(). This aligns it with how
CON_ENABLED is handled. To maintain symmetry and fix a potential bug
where flags might persist after removal, explicitly clear both
CON_ENABLED and CON_BRL in braille_unregister_console().
The patch should not change the existing behavior.
Signed-off-by: Petr Mladek <pmladek@suse.com>
Acked-by: Chris Down <chris@chrisdown.name>
Reviewed-by: Marcos Paulo de Souza <mpdesouza@suse.com>
---
drivers/accessibility/braille/braille_console.c | 7 ++++---
kernel/printk/braille.c | 16 +++-------------
kernel/printk/braille.h | 12 ++++++++++++
kernel/printk/printk.c | 13 +++++--------
4 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/drivers/accessibility/braille/braille_console.c b/drivers/accessibility/braille/braille_console.c
index 06b43b678d6e..7b324329882f 100644
--- a/drivers/accessibility/braille/braille_console.c
+++ b/drivers/accessibility/braille/braille_console.c
@@ -360,12 +360,12 @@ int braille_register_console(struct console *console, int index,
if (ret != 0)
return ret;
}
- console->flags |= CON_ENABLED;
+ console->flags |= CON_ENABLED | CON_BRL;
console->index = index;
braille_co = console;
register_keyboard_notifier(&keyboard_notifier_block);
register_vt_notifier(&vt_notifier_block);
- return 1;
+ return 0;
}
int braille_unregister_console(struct console *console)
@@ -375,5 +375,6 @@ int braille_unregister_console(struct console *console)
unregister_keyboard_notifier(&keyboard_notifier_block);
unregister_vt_notifier(&vt_notifier_block);
braille_co = NULL;
- return 1;
+ console->flags &= ~(CON_ENABLED | CON_BRL);
+ return 0;
}
diff --git a/kernel/printk/braille.c b/kernel/printk/braille.c
index 9d21a2bb1d38..593f83eb0487 100644
--- a/kernel/printk/braille.c
+++ b/kernel/printk/braille.c
@@ -37,22 +37,12 @@ int _braille_console_setup(char **str, char **brl_options)
int
_braille_register_console(struct console *console, struct preferred_console *pc)
{
- int rtn = 0;
-
- if (pc->brl_options) {
- console->flags |= CON_BRL;
- rtn = braille_register_console(console, pc->index, pc->options,
- pc->brl_options);
- }
-
- return rtn;
+ return braille_register_console(console, pc->index, pc->options,
+ pc->brl_options);
}
int
_braille_unregister_console(struct console *console)
{
- if (console->flags & CON_BRL)
- return braille_unregister_console(console);
-
- return 0;
+ return braille_unregister_console(console);
}
diff --git a/kernel/printk/braille.h b/kernel/printk/braille.h
index 0bdac303f8b1..ec5feac1f508 100644
--- a/kernel/printk/braille.h
+++ b/kernel/printk/braille.h
@@ -11,6 +11,12 @@ braille_update_options(struct preferred_console *pc, char *brl_options)
pc->brl_options = brl_options;
}
+static inline bool
+is_braille_console_preferred(struct preferred_console *pc)
+{
+ return (!!pc->brl_options);
+}
+
/*
* Setup console according to braille options.
* Return -EINVAL on syntax error, 0 on success (or no braille option was
@@ -34,6 +40,12 @@ braille_update_options(struct preferred_console *pc, char *brl_options)
{
}
+static inline bool
+is_braille_console_preferred(struct preferred_console *pc)
+{
+ return false;
+}
+
static inline int
_braille_console_setup(char **str, char **brl_options)
{
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index d251bf8e104f..7a3bbb0cb794 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -4001,8 +4001,8 @@ static int try_enable_preferred_console(struct console *newcon,
if (newcon->index < 0)
newcon->index = pc->index;
- if (_braille_register_console(newcon, pc))
- return 0;
+ if (is_braille_console_preferred(pc))
+ return _braille_register_console(newcon, pc);
err = console_call_setup(newcon, pc->options);
if (err)
@@ -4314,17 +4314,14 @@ static int unregister_console_locked(struct console *console)
bool found_boot_con = false;
unsigned long flags;
struct console *c;
- int res;
+ int res = 0;
lockdep_assert_console_list_lock_held();
con_printk(KERN_INFO, console, "disabled\n");
- res = _braille_unregister_console(console);
- if (res < 0)
- return res;
- if (res > 0)
- return 0;
+ if (console->flags & CON_BRL)
+ return _braille_unregister_console(console);
if (!console_is_registered_locked(console))
res = -ENODEV;
--
2.53.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v2 5/9] printk: Separate code for enabling console
2026-04-23 13:00 [PATCH v2 0/9] printk: Clean up preferred console handling Petr Mladek
` (3 preceding siblings ...)
2026-04-23 13:00 ` [PATCH v2 4/9] printk: Cleanup _braille_(un)register_console() wrappers Petr Mladek
@ 2026-04-23 13:00 ` Petr Mladek
2026-04-23 13:00 ` [PATCH v2 6/9] printk: Try to register each console as Braille first Petr Mladek
` (3 subsequent siblings)
8 siblings, 0 replies; 11+ messages in thread
From: Petr Mladek @ 2026-04-23 13:00 UTC (permalink / raw)
To: John Ogness
Cc: Sergey Senozhatsky, Steven Rostedt, Marcos Paulo de Souza,
Chris Down, linux-kernel, Petr Mladek
There are several code paths which try to enable a newly registered
console. Move the logic into a separate try_enable_console() function.
It simplifies a bit the long register_console() function definition.
Also followup patches are going to add even more code paths. And it will
be easier to use "return" when it does not make sense to try other
variants.
The patch does not change the existing behavior.
Signed-off-by: Petr Mladek <pmladek@suse.com>
---
kernel/printk/printk.c | 64 ++++++++++++++++++++++++------------------
1 file changed, 36 insertions(+), 28 deletions(-)
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 7a3bbb0cb794..2543c810efcb 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -4040,6 +4040,41 @@ static void try_enable_default_console(struct console *newcon)
newcon->flags |= CON_CONSDEV;
}
+#define console_first() \
+ hlist_entry(console_list.first, struct console, node)
+
+static int try_enable_console(struct console *newcon)
+{
+ int err;
+
+ /*
+ * See if we want to enable this console driver by default.
+ *
+ * Nope when a console is preferred by the command line, device
+ * tree, or SPCR.
+ *
+ * The first real console with tty binding (driver) wins. More
+ * consoles might get enabled before the right one is found.
+ *
+ * Note that a console with tty binding will have CON_CONSDEV
+ * flag set and will be first in the list.
+ */
+ if (preferred_dev_console < 0) {
+ if (hlist_empty(&console_list) || !console_first()->device ||
+ console_first()->flags & CON_BOOT) {
+ try_enable_default_console(newcon);
+ }
+ }
+
+ /* See if this console matches one we selected on the command line */
+ err = try_enable_preferred_console(newcon, true);
+ if (err != -ENOENT)
+ return err;
+
+ /* If not, try to match against the platform default(s) */
+ return try_enable_preferred_console(newcon, false);
+}
+
/* Return the starting sequence number for a newly registered console. */
static u64 get_init_console_seq(struct console *newcon, bool bootcon_registered)
{
@@ -4114,9 +4149,6 @@ static u64 get_init_console_seq(struct console *newcon, bool bootcon_registered)
return init_seq;
}
-#define console_first() \
- hlist_entry(console_list.first, struct console, node)
-
static int unregister_console_locked(struct console *console);
/*
@@ -4178,31 +4210,7 @@ void register_console(struct console *newcon)
goto unlock;
}
- /*
- * See if we want to enable this console driver by default.
- *
- * Nope when a console is preferred by the command line, device
- * tree, or SPCR.
- *
- * The first real console with tty binding (driver) wins. More
- * consoles might get enabled before the right one is found.
- *
- * Note that a console with tty binding will have CON_CONSDEV
- * flag set and will be first in the list.
- */
- if (preferred_dev_console < 0) {
- if (hlist_empty(&console_list) || !console_first()->device ||
- console_first()->flags & CON_BOOT) {
- try_enable_default_console(newcon);
- }
- }
-
- /* See if this console matches one we selected on the command line */
- err = try_enable_preferred_console(newcon, true);
-
- /* If not, try to match against the platform default(s) */
- if (err == -ENOENT)
- err = try_enable_preferred_console(newcon, false);
+ err = try_enable_console(newcon);
/* printk() messages are not printed to the Braille console. */
if (err || newcon->flags & CON_BRL) {
--
2.53.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v2 6/9] printk: Try to register each console as Braille first
2026-04-23 13:00 [PATCH v2 0/9] printk: Clean up preferred console handling Petr Mladek
` (4 preceding siblings ...)
2026-04-23 13:00 ` [PATCH v2 5/9] printk: Separate code for enabling console Petr Mladek
@ 2026-04-23 13:00 ` Petr Mladek
2026-04-23 13:00 ` [PATCH v2 7/9] printk: Do not set Braille console as preferred_console Petr Mladek
` (2 subsequent siblings)
8 siblings, 0 replies; 11+ messages in thread
From: Petr Mladek @ 2026-04-23 13:00 UTC (permalink / raw)
To: John Ogness
Cc: Sergey Senozhatsky, Steven Rostedt, Marcos Paulo de Souza,
Chris Down, linux-kernel, Petr Mladek
Braille consoles are unique: they can only be enabled via the command
line and use the preferred console framework for initialization, yet
they are never added to the console_list or associated with
/dev/console. Because of this, the preferred_console variable remains
unset when only a Braille console is requested.
Currently, try_enable_preferred_console() must be called even when
"preferred_dev_console" variable is not set, just to catch these "hidden"
Braille requests.
Refactor the logic by adding a parameter to try_enable_preferred_console()
to explicitly handle Braille vs. non-Braille cases. It will eventually
allow to skip try_enable_preferred_console() when there are no preferred
consoles. This improves code robustness by ensuring the console
setup is explicit and only performed once.
Note that _braille_register_console() is skipped when the given console
driver has a match() callback and it succeeded. It means that it took
over an early console and can't be used as a Braille console.
As a result try_enable_braille_console() might return success even
when it did not enabled the console in the Braille mode. It is
the reason why register_console() has to explicitly check whether
CON_BRL flag was really set and could skip the further steps.
The refactoring even fixes two subtle bugs:
1. When only the Braille console is defined on the command line,
the original code might attempt to enable the same console twice—once
as a default and once as a Braille console. This results in calling
the setup() callback twice and incorrectly setting the CON_CONSDEV flag.
2. When the same console is defined on the command line using devname
and then as Braille console, for example:
console=00:00:0.0,115200 console=brl,ttyS0,115200
It would have two separate entries in preferred_consoles[] array.
The 2nd (Braille) entry would be used when univ8250_console_init()
tries to register the generic "ttyS" console driver. Note that
the 1st entry still does not have defined the "name" entry at
this stage.
The 1st non-Braille entry would be used later when serial8250_init()
registers all found devices, assigns "tty0" for the given "00:00:0.0"
devname and tries to register the same struct console once again.
The original code would call newcon->setup() twice in this scenario.
It won't add the console into console_list only because the later
check in register_console() would detect CON_BRL flag set from
the 1st registration and return early.
Signed-off-by: Petr Mladek <pmladek@suse.com>
---
kernel/printk/printk.c | 56 +++++++++++++++++++++++++++++++++++++-----
1 file changed, 50 insertions(+), 6 deletions(-)
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 2543c810efcb..e34955189d16 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -367,6 +367,7 @@ static int console_locked;
static struct preferred_console preferred_consoles[MAX_PREFERRED_CONSOLES];
static int preferred_dev_console = -1;
+static bool want_braille_console;
int console_set_on_cmdline;
EXPORT_SYMBOL(console_set_on_cmdline);
@@ -2644,7 +2645,9 @@ static int update_preferred_console(unsigned int i,
braille_update_options(pc, brl_options);
- if (!brl_options)
+ if (brl_options)
+ want_braille_console = true;
+ else
preferred_dev_console = i;
/*
@@ -3975,8 +3978,9 @@ static int console_call_setup(struct console *newcon, char *options)
* Care need to be taken with consoles that are statically
* enabled such as netconsole
*/
-static int try_enable_preferred_console(struct console *newcon,
- bool user_specified)
+static int __try_enable_preferred_console(struct console *newcon,
+ bool user_specified,
+ bool try_only_braille)
{
struct preferred_console *pc;
int i, err;
@@ -3987,8 +3991,19 @@ static int try_enable_preferred_console(struct console *newcon,
/* Console not yet initialized? */
if (!pc->name[0])
continue;
- if (pc->user_specified != user_specified)
- continue;
+
+ /*
+ * @try_only_braille and @user_specifified define which
+ * preferred console entries are handled in this round.
+ */
+ if (try_only_braille) {
+ if (!is_braille_console_preferred(pc))
+ continue;
+ } else {
+ if (pc->user_specified != user_specified)
+ continue;
+ }
+
if (!newcon->match ||
newcon->match(newcon, pc->name, pc->index, pc->options) != 0) {
/* default matching */
@@ -4001,7 +4016,7 @@ static int try_enable_preferred_console(struct console *newcon,
if (newcon->index < 0)
newcon->index = pc->index;
- if (is_braille_console_preferred(pc))
+ if (try_only_braille)
return _braille_register_console(newcon, pc);
err = console_call_setup(newcon, pc->options);
@@ -4025,6 +4040,17 @@ static int try_enable_preferred_console(struct console *newcon,
return -ENOENT;
}
+static int try_enable_preferred_console(struct console *newcon,
+ bool user_specified)
+{
+ return __try_enable_preferred_console(newcon, user_specified, false);
+}
+
+static int try_enable_braille_console(struct console *newcon)
+{
+ return __try_enable_preferred_console(newcon, true, true);
+}
+
/* Try to enable the console unconditionally */
static void try_enable_default_console(struct console *newcon)
{
@@ -4047,6 +4073,24 @@ static int try_enable_console(struct console *newcon)
{
int err;
+ /*
+ * First, try to enable the console driver as a Braille console.
+ * It would have metadata in the preferred_consoles[] array.
+ * But it won't be counted as @preferred_console because
+ * it does not get printk() messages and is not associated
+ * with /dev/console.
+ *
+ * Note that it might succeed also when the driver has a match()
+ * callback and it took over a boot console. In this case,
+ * the driver will continue working as a classic non-Braille
+ * console.
+ */
+ if (want_braille_console) {
+ err = try_enable_braille_console(newcon);
+ if (err != -ENOENT)
+ return err;
+ }
+
/*
* See if we want to enable this console driver by default.
*
--
2.53.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v2 7/9] printk: Do not set Braille console as preferred_console
2026-04-23 13:00 [PATCH v2 0/9] printk: Clean up preferred console handling Petr Mladek
` (5 preceding siblings ...)
2026-04-23 13:00 ` [PATCH v2 6/9] printk: Try to register each console as Braille first Petr Mladek
@ 2026-04-23 13:00 ` Petr Mladek
2026-04-23 13:00 ` [PATCH v2 8/9] printk: Handle pre-enabled consoles in the top-level try_enable_console() Petr Mladek
2026-04-23 13:00 ` [PATCH v2 9/9] printk: Try enable preferred consoles only when there are any Petr Mladek
8 siblings, 0 replies; 11+ messages in thread
From: Petr Mladek @ 2026-04-23 13:00 UTC (permalink / raw)
To: John Ogness
Cc: Sergey Senozhatsky, Steven Rostedt, Marcos Paulo de Souza,
Chris Down, linux-kernel, Petr Mladek
The Braille console reuses the framework for handling consoles preferred
via the command line. However, it is a special-purpose interface that
neither receives standard printk messages nor associates with
/dev/console.
Currently, the "preferred_dev_console" variable can point to a Braille
console entry in the "preferred_consoles[]" array. This occurs if an
entry was first created for a non-Braille console, but a later 'console='
parameter redefined it as a Braille console.
Since a Braille console will only ever be enabled as such, it should not
be tracked as the primary system console. Adjust the logic to ensure
"preferred_dev_console" continues to point to the previously designated
normal console instead.
Signed-off-by: Petr Mladek <pmladek@suse.com>
---
kernel/printk/printk.c | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index e34955189d16..9143a050c289 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -367,6 +367,7 @@ static int console_locked;
static struct preferred_console preferred_consoles[MAX_PREFERRED_CONSOLES];
static int preferred_dev_console = -1;
+static int preferred_dev_console_prev = -1;
static bool want_braille_console;
int console_set_on_cmdline;
EXPORT_SYMBOL(console_set_on_cmdline);
@@ -2566,10 +2567,11 @@ asmlinkage __visible void early_printk(const char *fmt, ...)
* Note that a valid @name and @idx will get assigned later when
* @devname matches during the device initialization.
* 2. Specify @brl_options if the console should be enabled as
- * a Braille console [*]
+ * a Braille console.
* 3. Only matching entries can be updated.
* 4. @options passed via the command line are used when the same
* console is preferred also by some platform-specific code.
+ * 5. Braille console is never associated with /dev/console.[*]
*
* [*] Braille console is using the mechanism for registering consoles
* but it is very special. It is primarily used for user interaction
@@ -2645,10 +2647,22 @@ static int update_preferred_console(unsigned int i,
braille_update_options(pc, brl_options);
- if (brl_options)
+ /*
+ * The last preferred console should get associated with /dev/console.
+ * Except for the Braille console which can't get associated with
+ * /dev/console. One level history should be enough because only one,
+ * the VisioBraille device, is supported at the moment.
+ */
+ if (brl_options) {
want_braille_console = true;
- else
+ if (preferred_dev_console == i) {
+ preferred_dev_console = preferred_dev_console_prev;
+ preferred_dev_console_prev = -1;
+ }
+ } else if (!is_braille_console_preferred(pc)) {
+ preferred_dev_console_prev = preferred_dev_console;
preferred_dev_console = i;
+ }
/*
* @pc console was defined by the user on the command line.
--
2.53.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v2 8/9] printk: Handle pre-enabled consoles in the top-level try_enable_console()
2026-04-23 13:00 [PATCH v2 0/9] printk: Clean up preferred console handling Petr Mladek
` (6 preceding siblings ...)
2026-04-23 13:00 ` [PATCH v2 7/9] printk: Do not set Braille console as preferred_console Petr Mladek
@ 2026-04-23 13:00 ` Petr Mladek
2026-04-23 13:00 ` [PATCH v2 9/9] printk: Try enable preferred consoles only when there are any Petr Mladek
8 siblings, 0 replies; 11+ messages in thread
From: Petr Mladek @ 2026-04-23 13:00 UTC (permalink / raw)
To: John Ogness
Cc: Sergey Senozhatsky, Steven Rostedt, Marcos Paulo de Souza,
Chris Down, linux-kernel, Petr Mladek
The function try_enable_preferred_console() currently has the
non-obvious side effect of returning success for consoles that are
already pre-enabled. This obscures the logic flow during console
registration.
Move the check for pre-enabled consoles directly into the top-level
try_enable_console(). This change makes the handling of pre-enabled
consoles explicit and easier to follow.
Furthermore, this separation lays the groundwork for future cleanups
where try_enable_preferred_console() can be restricted to cases where
an entry actually exists in the preferred_consoles[] array.
Possible behavior change:
try_enable_preferred_console() will newly be called also with
@user_specified parameter set to "false" when it failed with the "true"
variant. But it looks like the right way to do. It will allow to call
newcon->setup() when the console was preferred by some platform
specific code.
Signed-off-by: Petr Mladek <pmladek@suse.com>
---
kernel/printk/printk.c | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 9143a050c289..91c3be6843bc 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -3988,9 +3988,6 @@ static int console_call_setup(struct console *newcon, char *options)
* the newly registered console with any of the ones selected
* by either the command line or add_preferred_console() and
* setup/enable it.
- *
- * Care need to be taken with consoles that are statically
- * enabled such as netconsole
*/
static int __try_enable_preferred_console(struct console *newcon,
bool user_specified,
@@ -4043,14 +4040,6 @@ static int __try_enable_preferred_console(struct console *newcon,
return 0;
}
- /*
- * Some consoles, such as pstore and netconsole, can be enabled even
- * without matching. Accept the pre-enabled consoles only when match()
- * and setup() had a chance to be called.
- */
- if (newcon->flags & CON_ENABLED && pc->user_specified == user_specified)
- return 0;
-
return -ENOENT;
}
@@ -4130,7 +4119,19 @@ static int try_enable_console(struct console *newcon)
return err;
/* If not, try to match against the platform default(s) */
- return try_enable_preferred_console(newcon, false);
+ err = try_enable_preferred_console(newcon, false);
+ if (err != -ENOENT)
+ return err;
+
+ /*
+ * Some consoles, such as pstore and netconsole, can be enabled even
+ * without matching. Accept them at this stage when they had a chance
+ * to match() and call setup().
+ */
+ if (newcon->flags & CON_ENABLED)
+ err = 0;
+
+ return err;
}
/* Return the starting sequence number for a newly registered console. */
--
2.53.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v2 9/9] printk: Try enable preferred consoles only when there are any
2026-04-23 13:00 [PATCH v2 0/9] printk: Clean up preferred console handling Petr Mladek
` (7 preceding siblings ...)
2026-04-23 13:00 ` [PATCH v2 8/9] printk: Handle pre-enabled consoles in the top-level try_enable_console() Petr Mladek
@ 2026-04-23 13:00 ` Petr Mladek
8 siblings, 0 replies; 11+ messages in thread
From: Petr Mladek @ 2026-04-23 13:00 UTC (permalink / raw)
To: John Ogness
Cc: Sergey Senozhatsky, Steven Rostedt, Marcos Paulo de Souza,
Chris Down, linux-kernel, Petr Mladek
try_enable_preferred_console() used to be always called because it
had several hidden effects, namely:
- enabled Braille consoles which were ignored by "preferred_dev_console"
because they were not associated with /dev/console.
- returned success when a console was pre-enabled using CON_ENABLED
flag.
- returned success when a console was enabled by default because
try_enable_default_console() did not return success.
The first two hidden effects were removed in previous patches. Remove
the last one so that try_enable_preferred_console() can be called only
when any non-Braille console is preferred.
Signed-off-by: Petr Mladek <pmladek@suse.com>
---
kernel/printk/printk.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 91c3be6843bc..4098ed3b735f 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -4055,18 +4055,23 @@ static int try_enable_braille_console(struct console *newcon)
}
/* Try to enable the console unconditionally */
-static void try_enable_default_console(struct console *newcon)
+static int try_enable_default_console(struct console *newcon)
{
+ int err;
+
if (newcon->index < 0)
newcon->index = 0;
- if (console_call_setup(newcon, NULL) != 0)
- return;
+ err = console_call_setup(newcon, NULL);
+ if (err)
+ return err;
newcon->flags |= CON_ENABLED;
if (newcon->device)
newcon->flags |= CON_CONSDEV;
+
+ return 0;
}
#define console_first() \
@@ -4109,7 +4114,9 @@ static int try_enable_console(struct console *newcon)
if (preferred_dev_console < 0) {
if (hlist_empty(&console_list) || !console_first()->device ||
console_first()->flags & CON_BOOT) {
- try_enable_default_console(newcon);
+ err = try_enable_default_console(newcon);
+ if (err != -ENOENT)
+ return err;
}
}
--
2.53.0
^ permalink raw reply related [flat|nested] 11+ messages in thread