Re: [PATCH v2 2/2] printk: Add update_preferred_console()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux PPP]     [Linux FS]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Linmodem]     [Device Mapper]     [Linux Kernel for ARM]

  Powered by Linux