[PATCH v5 04/16] printk: Separate code for adding/updating preferred console metadata
From: Petr Mladek
Date: Tue Sep 29 2026 - 08:12:22 EST
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.
Split the code for adding or updating entries to avoid code duplication.
Make it clear what operations are done only for new entries.
Use this opportunity and replace an int with an unsigned int for
iterating over the preferred_consoles array.
It is a preparation step before adding more consistency checks.
No intended functional changes.
Signed-off-by: Petr Mladek <pmladek@xxxxxxxx>
---
kernel/printk/printk.c | 108 ++++++++++++++++++++++++++---------------
1 file changed, 68 insertions(+), 40 deletions(-)
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index c3e50f19a32b..174aee533a53 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2544,26 +2544,33 @@ asmlinkage __visible void early_printk(const char *fmt, ...)
}
#endif
-static void set_user_specified(struct preferred_console *pc, bool user_specified)
-{
- if (!user_specified)
- return;
-
- /*
- * @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;
-}
-
-static int __add_preferred_console(const char *name, const short idx,
- const char *devname, char *options,
- char *brl_options, bool user_specified)
+/** add_or_update_preferred_console - Add or update a given entry in
+ * the preferred_consoles[] array.
+ * @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 adds or updates an entry in preferred_consoles[] array. Also
+ * it updates some global variables which are used to make the right decisions
+ * in register_console().
+ */
+static int add_or_update_preferred_console(unsigned int i,
+ const char *name, const short idx,
+ const char *devname, char *options,
+ char *brl_options, bool user_specified)
{
struct preferred_console *pc;
- int i;
+ bool is_new_entry = false;
+
+ if (i >= MAX_PREFERRED_CONSOLES)
+ return -E2BIG;
+
+ pc = &preferred_consoles[i];
if (!name && !devname)
return -EINVAL;
@@ -2577,35 +2584,56 @@ static int __add_preferred_console(const char *name, const short idx,
if (name && idx < 0)
return -EINVAL;
+ if (!pc->name[0] && !pc->devname[0])
+ is_new_entry = true;
+
+ if (is_new_entry) {
+ if (devname)
+ strscpy(pc->devname, devname);
+ if (name)
+ strscpy(pc->name, name);
+ pc->index = idx;
+ }
+
/*
- * See if this tty is not yet registered, and
- * if we have a slot free.
+ * Historically, the preferred options are stored only by the first
+ * caller who prefers the particular console.
*/
+ if (is_new_entry) {
+ pc->options = options;
+ braille_set_options(pc, brl_options);
+ }
+
+ if (!brl_options)
+ preferred_dev_console = i;
+
+ 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,
+ const char *devname, char *options,
+ char *brl_options, bool user_specified)
+{
+ struct preferred_console *pc;
+ unsigned int i;
+
+ /* See if this console is already preferred. */
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 add_or_update_preferred_console(i, name, idx, devname, options,
+ brl_options, user_specified);
}
static int __init console_msg_format_setup(char *str)
--
2.55.0