From: Petr Mladek <pmladek@suse.com>
To: John Ogness <john.ogness@linutronix.de>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>,
Steven Rostedt <rostedt@goodmis.org>,
Marcos Paulo de Souza <mpdesouza@suse.com>,
Chris Down <chris@chrisdown.name>,
Naveen Kumar Chaudhary <naveen.osdev@gmail.com>,
linux-kernel@vger.kernel.org, Petr Mladek <pmladek@suse.com>
Subject: [PATCH v5 04/16] printk: Separate code for adding/updating preferred console metadata
Date: Tue, 29 Sep 2026 14:05:34 +0200 [thread overview]
Message-ID: <20260929120546.328616-5-pmladek@suse.com> (raw)
In-Reply-To: <20260929120546.328616-1-pmladek@suse.com>
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@suse.com>
---
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
next prev parent reply other threads:[~2026-09-29 12:06 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-29 12:05 [PATCH v5 00/16] printk: Clean up preferred console handling Petr Mladek
2026-09-29 12:05 ` [PATCH v5 01/16] printk: Rename struct console_cmdline to preferred_console Petr Mladek
2026-09-29 12:05 ` [PATCH v5 02/16] printk: Rename preferred_console to preferred_dev_console Petr Mladek
2026-09-29 12:05 ` [PATCH v5 03/16] printk: Cleanup _braille_(un)register_console() wrappers Petr Mladek
2026-09-29 12:05 ` Petr Mladek [this message]
2026-09-29 12:05 ` [PATCH v5 05/16] printk: Prefer the console either via name or devname exclusively Petr Mladek
2026-09-29 12:05 ` [PATCH v5 06/16] printk: Check that index is not defined when a console is preferred via devname Petr Mladek
2026-09-29 12:05 ` [PATCH v5 07/16] printk: Ensure consistent name and devname when updating preferred console Petr Mladek
2026-09-29 12:05 ` [PATCH v5 08/16] printk: Do not quietly ignore adding entry for a preferred console when there is no space Petr Mladek
2026-09-29 12:05 ` [PATCH v5 09/16] printk: Allow to override options via the command line Petr Mladek
2026-09-29 12:05 ` [PATCH v5 10/16] printk: Allow to debug misuse of add_or_update_preferred_console() Petr Mladek
2026-09-29 12:05 ` [PATCH v5 11/16] console/braille: Lock console->setup() call during the registration Petr Mladek
2026-09-29 12:05 ` [PATCH v5 12/16] printk: Separate code for enabling console Petr Mladek
2026-09-29 12:05 ` [PATCH v5 13/16] printk: Try to register each console as Braille first Petr Mladek
2026-09-29 12:05 ` [PATCH v5 14/16] printk: Do not set Braille console as preferred_console Petr Mladek
2026-09-29 12:05 ` [PATCH v5 15/16] printk: Modify try_enable_default_console() to return error/success Petr Mladek
2026-09-29 12:05 ` [PATCH v5 16/16] printk: Try enable preferred consoles only when there are any Petr Mladek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260929120546.328616-5-pmladek@suse.com \
--to=pmladek@suse.com \
--cc=chris@chrisdown.name \
--cc=john.ogness@linutronix.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mpdesouza@suse.com \
--cc=naveen.osdev@gmail.com \
--cc=rostedt@goodmis.org \
--cc=senozhatsky@chromium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®