From: Tony Lindgren <tony.lindgren@linux.intel.com>
To: Petr Mladek <pmladek@suse.com>
Cc: "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Jiri Slaby" <jirislaby@kernel.org>,
"Steven Rostedt" <rostedt@goodmis.org>,
"John Ogness" <john.ogness@linutronix.de>,
"Sergey Senozhatsky" <senozhatsky@chromium.org>,
"Andy Shevchenko" <andriy.shevchenko@linux.intel.com>,
"Tony Lindgren" <tony@atomide.com>,
"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>,
linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 2/2] printk: Add update_preferred_console()
Date: Mon, 17 Jun 2024 10:20:57 +0300 [thread overview]
Message-ID: <Zm_j2eq3QcaA-g-e@tlindgre-MOBL1> (raw)
In-Reply-To: <Zmx7IPQX4FVdSe1J@pathway.suse.cz>
On Fri, Jun 14, 2024 at 07:17:20PM +0200, Petr Mladek wrote:
> On Thu 2024-06-13 15:51:08, Tony Lindgren wrote:
> > The earlier attempt on doing this caused a regression with the kernel
> > command line console order as it added calling __add_preferred_console()
> > again later on during init. A better approach was suggested by Petr where
> > we add the deferred console to the console_cmdline[] and update it later
> > on when the console is ready.
>
> The patch seems to work well. And I am surprised that it is so small ;-)
Your intuition at work :)
> > diff --git a/drivers/tty/serial/serial_base_bus.c b/drivers/tty/serial/serial_base_bus.c
> > index 5ebacb982f9e..a34f55ef6f37 100644
> > --- a/drivers/tty/serial/serial_base_bus.c
> > +++ b/drivers/tty/serial/serial_base_bus.c
> > @@ -210,7 +210,13 @@ void serial_base_port_device_remove(struct serial_port_device *port_dev)
> > static int serial_base_add_one_prefcon(const char *match, const char *dev_name,
> > int port_id)
>
> I would suggest to rename also functions on the serial_base side.
> The function is not adding prefcon. It is doing some match_and_update
> job.
OK good idea, I'll do a separate patch for that.
> > --- a/kernel/printk/printk.c
> > +++ b/kernel/printk/printk.c
> > @@ -2486,8 +2495,8 @@ __setup("console_msg_format=", console_msg_format_setup);
> > */
> > static int __init console_setup(char *str)
> > {
> > - char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for "ttyS" */
> > - char *s, *options, *brl_options = NULL;
>
> I would add
>
> static_assert(sizeof(console_cmdline[0].devname) >= sizeof(console_cmdline[0].name));
That check should still be >= sizeof(console_cmdline[0].name) + 4, right?
For the "number only" consoles we add the "ttyS" prefix.
> The name "chardev" sounds as generic as "devname". I would use one of
>
> + "name" like the parameter in __add_preferred_console
> + "ttyname" as it is mostly used for "tty*" console names
> + "conname" like a name in struct console.
>
> Also please split the variables per-line so that future diff's are
> easier to follow. Something like:
>
> static_assert(sizeof(console_cmdline[0].devname) >= sizeof(console_cmdline[0].name));
> char buf[sizeof(console_cmdline[0].devname)];
> char *brl_options = NULL;
> char *ttyname = NULL;
> char *devname = NULL;
> char *options;
> char *s;
> int idx;
OK I'll use ttyname like you're suggesting.
> > @@ -2523,12 +2538,12 @@ static int __init console_setup(char *str)
> > #endif
> >
> > for (s = buf; *s; s++)
> > - if (isdigit(*s) || *s == ',')
> > + if ((chardev && isdigit(*s)) || *s == ',')
> > break;
> > idx = simple_strtoul(s, NULL, 10);
>
> The @idx value is not really important when @devname is used.
> But it still would be more clear to set it to -1.
OK
> My proposal might be kind of naive. Some people might say that
> it describes obvious things. But the API is for device driver
> users which do not know much about how printk handles
> the console command line and the registration.
>
> <proposal>
> /**
> * match_devname_and_update_preferred_console - Update a preferred console
> * when matching devname is found.
> * @devname: DEVNAME:0.0 style device name
> * @name: Name of the corresponding console driver, e.g. "ttyS"
> * @idx: Console index, e.g. port number.
> *
> * The function checks whether a device with the given @devname is
> * preferred via the console=DEVNAME:0.0 command line option.
> * It fills the missing console driver name and console index
> * so that a later register_console() call could find (match)
> * and enable this device.
> *
> * It might be used when a driver subsystem initializes particular
> * devices with already known DEVNAME:0.0 style names. And it
> * could predict which console driver name and index this device
> * would later get associated with.
> *
> * Return: 0 on success, negative error code on failure.
> */
> </proposal>
That looks good to me.
> At least, this is my understanding of how this works.
>
> I do not know the whole history. And maybe I get something wrong.
> IMHO, the main problem is that the printk console code
> historically uses TTY device names. But we want to register/enable
> the consoles ASAP when the HW devices are ready for writing().
> It happens before the TTY subsystem gets initialized so
> that we could not use the sysfs kobjects for matching
> the tty device driver names with HW device driver names.
> And we need this kind of hacks.
Yes that's correct.
> > +int update_preferred_console(const char *devname, const char *name, const short idx)
> > +{
> > + struct console_cmdline *c = console_cmdline;
> > + 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)) {
>
> I would add here:
>
> pr_info("associate the preferred console \"%s\" with \"%s%d\"\n",
> devname, name, idx);
>
OK
Regards,
Tony
next prev parent reply other threads:[~2024-06-17 7:21 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-13 12:51 [PATCH v2 0/2] Fixes for console command line ordering Tony Lindgren
2024-06-13 12:51 ` [PATCH v2 1/2] printk: Revert add_preferred_console_match() related commits Tony Lindgren
2024-06-14 17:18 ` Petr Mladek
2024-06-13 12:51 ` [PATCH v2 2/2] printk: Add update_preferred_console() Tony Lindgren
2024-06-14 17:17 ` Petr Mladek
2024-06-17 7:20 ` Tony Lindgren [this message]
2024-06-17 8:03 ` 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=Zm_j2eq3QcaA-g-e@tlindgre-MOBL1 \
--to=tony.lindgren@linux.intel.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=gregkh@linuxfoundation.org \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=jirislaby@kernel.org \
--cc=john.ogness@linutronix.de \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=pmladek@suse.com \
--cc=rostedt@goodmis.org \
--cc=senozhatsky@chromium.org \
--cc=tony@atomide.com \
/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