2023-08-06 07:10:46

by Tony Lindgren

[permalink] [raw]
Subject: [PATCH] serial: core: Revert port_id use

Guenter reports boot issues with duplicate sysfs entries for multiport
drivers. Let's go back to using port->line for now to fix the regression.

With this change, the serial core port device names are not correct for the
hardware specific 8250 single port drivers, but that's a cosmetic issue for
now.

Fixes: d962de6ae51f ("serial: core: Fix serial core port id to not use port->line")
Reported-by: Guenter Roeck <[email protected]>
Signed-off-by: Tony Lindgren <[email protected]>
---
drivers/tty/serial/serial_base_bus.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/tty/serial/serial_base_bus.c b/drivers/tty/serial/serial_base_bus.c
--- a/drivers/tty/serial/serial_base_bus.c
+++ b/drivers/tty/serial/serial_base_bus.c
@@ -151,7 +151,7 @@ struct serial_port_device *serial_base_port_add(struct uart_port *port,
err = serial_base_device_init(port, &port_dev->dev,
&ctrl_dev->dev, &serial_port_type,
serial_base_port_release,
- port->ctrl_id, port->port_id);
+ port->ctrl_id, port->line);
if (err)
goto err_put_device;

--
2.41.0


2023-08-06 13:41:58

by Guenter Roeck

[permalink] [raw]
Subject: Re: [PATCH] serial: core: Revert port_id use

On Sun, Aug 06, 2023 at 09:20:50AM +0300, Tony Lindgren wrote:
> Guenter reports boot issues with duplicate sysfs entries for multiport
> drivers. Let's go back to using port->line for now to fix the regression.
>
> With this change, the serial core port device names are not correct for the
> hardware specific 8250 single port drivers, but that's a cosmetic issue for
> now.
>
> Fixes: d962de6ae51f ("serial: core: Fix serial core port id to not use port->line")
> Reported-by: Guenter Roeck <[email protected]>
> Signed-off-by: Tony Lindgren <[email protected]>

Tested-by: Guenter Roeck <[email protected]>

Guenter

2023-08-09 05:47:32

by Tony Lindgren

[permalink] [raw]
Subject: Re: [PATCH] serial: core: Revert port_id use

Hi,

* Guenter Roeck <[email protected]> [230806 13:19]:
> On Sun, Aug 06, 2023 at 09:20:50AM +0300, Tony Lindgren wrote:
> > Guenter reports boot issues with duplicate sysfs entries for multiport
> > drivers. Let's go back to using port->line for now to fix the regression.
> >
> > With this change, the serial core port device names are not correct for the
> > hardware specific 8250 single port drivers, but that's a cosmetic issue for
> > now.
> >
> > Fixes: d962de6ae51f ("serial: core: Fix serial core port id to not use port->line")
> > Reported-by: Guenter Roeck <[email protected]>
> > Signed-off-by: Tony Lindgren <[email protected]>
>
> Tested-by: Guenter Roeck <[email protected]>

Thanks for testing.

Guenter, care to also test the patch below on top of this fix and
see if things still behave for you?

I'll send a proper patch assuming things test fine.

Regagrds,

Tony

8< --------------------
diff --git a/drivers/tty/serial/serial_base.h b/drivers/tty/serial/serial_base.h
--- a/drivers/tty/serial/serial_base.h
+++ b/drivers/tty/serial/serial_base.h
@@ -16,6 +16,7 @@ struct device;

struct serial_ctrl_device {
struct device dev;
+ struct ida ida;
};

struct serial_port_device {
diff --git a/drivers/tty/serial/serial_base_bus.c b/drivers/tty/serial/serial_base_bus.c
--- a/drivers/tty/serial/serial_base_bus.c
+++ b/drivers/tty/serial/serial_base_bus.c
@@ -10,6 +10,7 @@

#include <linux/container_of.h>
#include <linux/device.h>
+#include <linux/idr.h>
#include <linux/module.h>
#include <linux/serial_core.h>
#include <linux/slab.h>
@@ -112,6 +113,8 @@ struct serial_ctrl_device *serial_base_ctrl_add(struct uart_port *port,
if (!ctrl_dev)
return ERR_PTR(-ENOMEM);

+ ida_init(&ctrl_dev->ida);
+
err = serial_base_device_init(port, &ctrl_dev->dev,
parent, &serial_ctrl_type,
serial_base_ctrl_release,
@@ -142,16 +145,31 @@ struct serial_port_device *serial_base_port_add(struct uart_port *port,
struct serial_ctrl_device *ctrl_dev)
{
struct serial_port_device *port_dev;
+ unsigned int min = 0, max = ~0U;
int err;

port_dev = kzalloc(sizeof(*port_dev), GFP_KERNEL);
if (!port_dev)
return ERR_PTR(-ENOMEM);

+ /* Device driver specified port_id vs automatic assignment? */
+ if (port->port_id) {
+ min = port->port_id;
+ max = port->port_id;
+ }
+
+ err = ida_alloc_range(&ctrl_dev->ida, min, max, GFP_KERNEL);
+ if (err < 0) {
+ kfree(port_dev);
+ return ERR_PTR(err);
+ }
+
+ port->port_id = err;
+
err = serial_base_device_init(port, &port_dev->dev,
&ctrl_dev->dev, &serial_port_type,
serial_base_port_release,
- port->ctrl_id, port->line);
+ port->ctrl_id, port->port_id);
if (err)
goto err_put_device;

@@ -165,16 +183,24 @@ struct serial_port_device *serial_base_port_add(struct uart_port *port,

err_put_device:
put_device(&port_dev->dev);
+ ida_free(&ctrl_dev->ida, port->port_id);

return ERR_PTR(err);
}

void serial_base_port_device_remove(struct serial_port_device *port_dev)
{
+ struct serial_ctrl_device *ctrl_dev;
+ struct device *parent;
+
if (!port_dev)
return;

+ parent = port_dev->dev.parent;
+ ctrl_dev = to_serial_base_ctrl_device(parent);
+
device_del(&port_dev->dev);
+ ida_free(&ctrl_dev->ida, port_dev->port->port_id);
put_device(&port_dev->dev);
}

--
2.41.0

2023-08-09 06:12:25

by Tony Lindgren

[permalink] [raw]
Subject: Re: [PATCH] serial: core: Revert port_id use

* Guenter Roeck <[email protected]> [230809 05:36]:
> On 8/8/23 22:26, Tony Lindgren wrote:
> > Hi,
> >
> > * Guenter Roeck <[email protected]> [230806 13:19]:
> > > On Sun, Aug 06, 2023 at 09:20:50AM +0300, Tony Lindgren wrote:
> > > > Guenter reports boot issues with duplicate sysfs entries for multiport
> > > > drivers. Let's go back to using port->line for now to fix the regression.
> > > >
> > > > With this change, the serial core port device names are not correct for the
> > > > hardware specific 8250 single port drivers, but that's a cosmetic issue for
> > > > now.
> > > >
> > > > Fixes: d962de6ae51f ("serial: core: Fix serial core port id to not use port->line")
> > > > Reported-by: Guenter Roeck <[email protected]>
> > > > Signed-off-by: Tony Lindgren <[email protected]>
> > >
> > > Tested-by: Guenter Roeck <[email protected]>
> >
> > Thanks for testing.
> >
> > Guenter, care to also test the patch below on top of this fix and
> > see if things still behave for you?
> >
>
> Queued. We should have test results sometime tomorrow.

OK great.

Thanks,

Tony

2023-08-09 06:24:08

by Tony Lindgren

[permalink] [raw]
Subject: Re: [PATCH] serial: core: Revert port_id use

* Dhruva Gole <[email protected]> [230809 05:33]:
> On Aug 09, 2023 at 08:26:50 +0300, Tony Lindgren wrote:
> > --- a/drivers/tty/serial/serial_base.h
> > +++ b/drivers/tty/serial/serial_base.h
> > @@ -16,6 +16,7 @@ struct device;
> >
> > struct serial_ctrl_device {
> > struct device dev;
> > + struct ida ida;
>
> When you send the proper patch, might want to change variable name to
> something other than ida?

OK I'll change it to port_ida.

Tony

2023-08-09 06:25:52

by Dhruva Gole

[permalink] [raw]
Subject: Re: [PATCH] serial: core: Revert port_id use

On Aug 09, 2023 at 08:26:50 +0300, Tony Lindgren wrote:
> Hi,
>
> * Guenter Roeck <[email protected]> [230806 13:19]:
> > On Sun, Aug 06, 2023 at 09:20:50AM +0300, Tony Lindgren wrote:
> > > Guenter reports boot issues with duplicate sysfs entries for multiport
> > > drivers. Let's go back to using port->line for now to fix the regression.
> > >
> > > With this change, the serial core port device names are not correct for the
> > > hardware specific 8250 single port drivers, but that's a cosmetic issue for
> > > now.
> > >
> > > Fixes: d962de6ae51f ("serial: core: Fix serial core port id to not use port->line")
> > > Reported-by: Guenter Roeck <[email protected]>
> > > Signed-off-by: Tony Lindgren <[email protected]>
> >
> > Tested-by: Guenter Roeck <[email protected]>
>
> Thanks for testing.
>
> Guenter, care to also test the patch below on top of this fix and
> see if things still behave for you?
>
> I'll send a proper patch assuming things test fine.
>
> Regagrds,
>
> Tony
>
> 8< --------------------
> diff --git a/drivers/tty/serial/serial_base.h b/drivers/tty/serial/serial_base.h
> --- a/drivers/tty/serial/serial_base.h
> +++ b/drivers/tty/serial/serial_base.h
> @@ -16,6 +16,7 @@ struct device;
>
> struct serial_ctrl_device {
> struct device dev;
> + struct ida ida;

When you send the proper patch, might want to change variable name to
something other than ida?

[...]
>
> --
> 2.41.0

--
Best regards,
Dhruva Gole <[email protected]>

2023-08-09 06:27:26

by Guenter Roeck

[permalink] [raw]
Subject: Re: [PATCH] serial: core: Revert port_id use

On 8/8/23 22:26, Tony Lindgren wrote:
> Hi,
>
> * Guenter Roeck <[email protected]> [230806 13:19]:
>> On Sun, Aug 06, 2023 at 09:20:50AM +0300, Tony Lindgren wrote:
>>> Guenter reports boot issues with duplicate sysfs entries for multiport
>>> drivers. Let's go back to using port->line for now to fix the regression.
>>>
>>> With this change, the serial core port device names are not correct for the
>>> hardware specific 8250 single port drivers, but that's a cosmetic issue for
>>> now.
>>>
>>> Fixes: d962de6ae51f ("serial: core: Fix serial core port id to not use port->line")
>>> Reported-by: Guenter Roeck <[email protected]>
>>> Signed-off-by: Tony Lindgren <[email protected]>
>>
>> Tested-by: Guenter Roeck <[email protected]>
>
> Thanks for testing.
>
> Guenter, care to also test the patch below on top of this fix and
> see if things still behave for you?
>

Queued. We should have test results sometime tomorrow.

Guenter


2023-08-10 00:59:12

by Guenter Roeck

[permalink] [raw]
Subject: Re: [PATCH] serial: core: Revert port_id use

On 8/8/23 22:26, Tony Lindgren wrote:
> Hi,
>
> * Guenter Roeck <[email protected]> [230806 13:19]:
>> On Sun, Aug 06, 2023 at 09:20:50AM +0300, Tony Lindgren wrote:
>>> Guenter reports boot issues with duplicate sysfs entries for multiport
>>> drivers. Let's go back to using port->line for now to fix the regression.
>>>
>>> With this change, the serial core port device names are not correct for the
>>> hardware specific 8250 single port drivers, but that's a cosmetic issue for
>>> now.
>>>
>>> Fixes: d962de6ae51f ("serial: core: Fix serial core port id to not use port->line")
>>> Reported-by: Guenter Roeck <[email protected]>
>>> Signed-off-by: Tony Lindgren <[email protected]>
>>
>> Tested-by: Guenter Roeck <[email protected]>
>
> Thanks for testing.
>
> Guenter, care to also test the patch below on top of this fix and
> see if things still behave for you?
>
> I'll send a proper patch assuming things test fine.
>

Patch below works for me.

Tested-by: Guenter Roeck <[email protected]>

Guenter

> Regagrds,
>
> Tony
>
> 8< --------------------
> diff --git a/drivers/tty/serial/serial_base.h b/drivers/tty/serial/serial_base.h
> --- a/drivers/tty/serial/serial_base.h
> +++ b/drivers/tty/serial/serial_base.h
> @@ -16,6 +16,7 @@ struct device;
>
> struct serial_ctrl_device {
> struct device dev;
> + struct ida ida;
> };
>
> struct serial_port_device {
> diff --git a/drivers/tty/serial/serial_base_bus.c b/drivers/tty/serial/serial_base_bus.c
> --- a/drivers/tty/serial/serial_base_bus.c
> +++ b/drivers/tty/serial/serial_base_bus.c
> @@ -10,6 +10,7 @@
>
> #include <linux/container_of.h>
> #include <linux/device.h>
> +#include <linux/idr.h>
> #include <linux/module.h>
> #include <linux/serial_core.h>
> #include <linux/slab.h>
> @@ -112,6 +113,8 @@ struct serial_ctrl_device *serial_base_ctrl_add(struct uart_port *port,
> if (!ctrl_dev)
> return ERR_PTR(-ENOMEM);
>
> + ida_init(&ctrl_dev->ida);
> +
> err = serial_base_device_init(port, &ctrl_dev->dev,
> parent, &serial_ctrl_type,
> serial_base_ctrl_release,
> @@ -142,16 +145,31 @@ struct serial_port_device *serial_base_port_add(struct uart_port *port,
> struct serial_ctrl_device *ctrl_dev)
> {
> struct serial_port_device *port_dev;
> + unsigned int min = 0, max = ~0U;
> int err;
>
> port_dev = kzalloc(sizeof(*port_dev), GFP_KERNEL);
> if (!port_dev)
> return ERR_PTR(-ENOMEM);
>
> + /* Device driver specified port_id vs automatic assignment? */
> + if (port->port_id) {
> + min = port->port_id;
> + max = port->port_id;
> + }
> +
> + err = ida_alloc_range(&ctrl_dev->ida, min, max, GFP_KERNEL);
> + if (err < 0) {
> + kfree(port_dev);
> + return ERR_PTR(err);
> + }
> +
> + port->port_id = err;
> +
> err = serial_base_device_init(port, &port_dev->dev,
> &ctrl_dev->dev, &serial_port_type,
> serial_base_port_release,
> - port->ctrl_id, port->line);
> + port->ctrl_id, port->port_id);
> if (err)
> goto err_put_device;
>
> @@ -165,16 +183,24 @@ struct serial_port_device *serial_base_port_add(struct uart_port *port,
>
> err_put_device:
> put_device(&port_dev->dev);
> + ida_free(&ctrl_dev->ida, port->port_id);
>
> return ERR_PTR(err);
> }
>
> void serial_base_port_device_remove(struct serial_port_device *port_dev)
> {
> + struct serial_ctrl_device *ctrl_dev;
> + struct device *parent;
> +
> if (!port_dev)
> return;
>
> + parent = port_dev->dev.parent;
> + ctrl_dev = to_serial_base_ctrl_device(parent);
> +
> device_del(&port_dev->dev);
> + ida_free(&ctrl_dev->ida, port_dev->port->port_id);
> put_device(&port_dev->dev);
> }
>


2023-08-10 07:40:28

by Tony Lindgren

[permalink] [raw]
Subject: Re: [PATCH] serial: core: Revert port_id use

* Guenter Roeck <[email protected]> [230809 21:17]:
> On 8/8/23 22:26, Tony Lindgren wrote:
> > Guenter, care to also test the patch below on top of this fix and
> > see if things still behave for you?
> >
> > I'll send a proper patch assuming things test fine.
> >
>
> Patch below works for me.

OK good to hear thanks, patch posted at [0] below.

Regards,

Tony

[0] https://lore.kernel.org/linux-serial/[email protected]/T/#u