diff mbox series

[1/2] serial: imx: fix crash when un/re-binding console

Message ID 20211014071053.568598-2-francesco.dolcini@toradex.com (mailing list archive)
State New, archived
Headers show
Series [1/2] serial: imx: fix crash when un/re-binding console | expand

Commit Message

Francesco Dolcini Oct. 14, 2021, 7:10 a.m. UTC
From: Stefan Agner <stefan@agner.ch>

If the device used as a serial console gets un/re-binded, then
register_console() will call imx_uart_setup_console() again.
Drop __init so that imx_uart_setup_console() can be safely called
at runtime.

Signed-off-by: Stefan Agner <stefan@agner.ch>
Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
---
 drivers/tty/serial/imx.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Greg Kroah-Hartman Oct. 14, 2021, 7:33 a.m. UTC | #1
On Thu, Oct 14, 2021 at 09:10:52AM +0200, Francesco Dolcini wrote:
> From: Stefan Agner <stefan@agner.ch>
> 
> If the device used as a serial console gets un/re-binded, then
> register_console() will call imx_uart_setup_console() again.
> Drop __init so that imx_uart_setup_console() can be safely called
> at runtime.
> 
> Signed-off-by: Stefan Agner <stefan@agner.ch>
> Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
> ---
>  drivers/tty/serial/imx.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)

What commit does this "fix"?  Should this go to stable kernels?  If so,
how far back?

> 
> diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
> index 8b121cd869e9..51a9f9423b1a 100644
> --- a/drivers/tty/serial/imx.c
> +++ b/drivers/tty/serial/imx.c
> @@ -2017,7 +2017,7 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count)
>   * If the port was already initialised (eg, by a boot loader),
>   * try to determine the current setup.
>   */
> -static void __init
> +static void
>  imx_uart_console_get_options(struct imx_port *sport, int *baud,
>  			     int *parity, int *bits)
>  {
> @@ -2076,7 +2076,7 @@ imx_uart_console_get_options(struct imx_port *sport, int *baud,
>  	}
>  }
>  
> -static int __init
> +static int
>  imx_uart_console_setup(struct console *co, char *options)

Why didn't we get a build warning about this section being called by
code that was not thrown away?  That feels odd...

thanks,

greg k-h
Francesco Dolcini Oct. 14, 2021, 8:01 a.m. UTC | #2
Hello Greg,

On Thu, Oct 14, 2021 at 09:33:55AM +0200, Greg Kroah-Hartman wrote:
> On Thu, Oct 14, 2021 at 09:10:52AM +0200, Francesco Dolcini wrote:
> > From: Stefan Agner <stefan@agner.ch>
> > 
> > If the device used as a serial console gets un/re-binded, then
> > register_console() will call imx_uart_setup_console() again.
> > Drop __init so that imx_uart_setup_console() can be safely called
> > at runtime.
> > 
> > Signed-off-by: Stefan Agner <stefan@agner.ch>
> > Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
> > ---
> >  drivers/tty/serial/imx.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> What commit does this "fix"?

root@colibri-imx6ull-06746657:~# cat /sys/devices/virtual/tty/console/active 
tty1 ttymxc0
root@colibri-imx6ull-06746657:~# echo -n N > /sys/devices/virtual/tty/console/subsystem/ttymxc0/console
root@colibri-imx6ull-06746657:~# echo -n Y > /sys/devices/virtual/tty/console/subsystem/ttymxc0/console

struct console ->setup is called at that time, but imx_uart_console_setup() is gone ...

According to the original report from Stefan the issue is the same with unbind/bind of the console,
see https://marc.info/?l=linux-serial&m=154221779312036&w=2.


> Should this go to stable kernels?  If so, how far back?
This is present also in 4.19 kernel, I feel like the issue is there since it is possible to unbind
a console driver (since ever considering the current LTS releases?). I could
investigate this a little bit more.

We have this patch in our kernel branch since 3 years but for some reason we never managed to upstream it.


Francesco
Uwe Kleine-König Oct. 14, 2021, 8:10 a.m. UTC | #3
On Thu, Oct 14, 2021 at 10:01:53AM +0200, Francesco Dolcini wrote:
> Hello Greg,
> 
> On Thu, Oct 14, 2021 at 09:33:55AM +0200, Greg Kroah-Hartman wrote:
> > On Thu, Oct 14, 2021 at 09:10:52AM +0200, Francesco Dolcini wrote:
> > > From: Stefan Agner <stefan@agner.ch>
> > > 
> > > If the device used as a serial console gets un/re-binded, then
> > > register_console() will call imx_uart_setup_console() again.
> > > Drop __init so that imx_uart_setup_console() can be safely called
> > > at runtime.
> > > 
> > > Signed-off-by: Stefan Agner <stefan@agner.ch>
> > > Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
> > > ---
> > >  drivers/tty/serial/imx.c | 4 ++--
> > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > What commit does this "fix"?
> 
> root@colibri-imx6ull-06746657:~# cat /sys/devices/virtual/tty/console/active 
> tty1 ttymxc0
> root@colibri-imx6ull-06746657:~# echo -n N > /sys/devices/virtual/tty/console/subsystem/ttymxc0/console
> root@colibri-imx6ull-06746657:~# echo -n Y > /sys/devices/virtual/tty/console/subsystem/ttymxc0/console
> 
> struct console ->setup is called at that time, but imx_uart_console_setup() is gone ...
> 
> According to the original report from Stefan the issue is the same with unbind/bind of the console,
> see https://marc.info/?l=linux-serial&m=154221779312036&w=2.
> 
> 
> > Should this go to stable kernels?  If so, how far back?
> This is present also in 4.19 kernel, I feel like the issue is there since it is possible to unbind
> a console driver (since ever considering the current LTS releases?). I could
> investigate this a little bit more.
> 
> We have this patch in our kernel branch since 3 years but for some reason we never managed to upstream it.

I think this is a bigger problem not only affecting imx.c. Just look at
the output of:

	git grep -E '__init.*setup' drivers/tty/serial/

Best regards
Uwe
Francesco Dolcini Oct. 14, 2021, 9:12 a.m. UTC | #4
Hello Uwe,

On Thu, Oct 14, 2021 at 10:10:28AM +0200, Uwe Kleine-König wrote:
> On Thu, Oct 14, 2021 at 10:01:53AM +0200, Francesco Dolcini wrote:
> > Hello Greg,
> > 
> > On Thu, Oct 14, 2021 at 09:33:55AM +0200, Greg Kroah-Hartman wrote:
> > > On Thu, Oct 14, 2021 at 09:10:52AM +0200, Francesco Dolcini wrote:
> > > > From: Stefan Agner <stefan@agner.ch>
> > > > 
> > > > If the device used as a serial console gets un/re-binded, then
> > > > register_console() will call imx_uart_setup_console() again.
> > > > Drop __init so that imx_uart_setup_console() can be safely called
> > > > at runtime.
> > > > 
> > > > Signed-off-by: Stefan Agner <stefan@agner.ch>
> > > > Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
> > > > ---
> > > >  drivers/tty/serial/imx.c | 4 ++--
> > > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > > 
> > > What commit does this "fix"?
> > 
> > root@colibri-imx6ull-06746657:~# cat /sys/devices/virtual/tty/console/active 
> > tty1 ttymxc0
> > root@colibri-imx6ull-06746657:~# echo -n N > /sys/devices/virtual/tty/console/subsystem/ttymxc0/console
> > root@colibri-imx6ull-06746657:~# echo -n Y > /sys/devices/virtual/tty/console/subsystem/ttymxc0/console
> > 
> > struct console ->setup is called at that time, but imx_uart_console_setup() is gone ...
> > 
> > According to the original report from Stefan the issue is the same with unbind/bind of the console,
> > see https://marc.info/?l=linux-serial&m=154221779312036&w=2.
> > 
> > 
> > > Should this go to stable kernels?  If so, how far back?
> > This is present also in 4.19 kernel, I feel like the issue is there since it is possible to unbind
> > a console driver (since ever considering the current LTS releases?). I could
> > investigate this a little bit more.
> > 
> > We have this patch in our kernel branch since 3 years but for some reason we never managed to upstream it.
> 
> I think this is a bigger problem not only affecting imx.c. Just look at
> the output of:
> 
> 	git grep -E '__init.*setup' drivers/tty/serial/

I agree, but I think that all the earlyconsole stuff is not affected, so the amount of drivers
that should be fixed is less than it looks like.

Apart for that once you fix this issue you need to be sure that on the unbind/unregister path you undo
all you did in the setup, maybe for most of the drivers is nothing, but for serial/imx I had to
disable the clock there (see patch 2/2 in this patchset).

Francesco
Francesco Dolcini Oct. 14, 2021, 10:28 a.m. UTC | #5
On Thu, Oct 14, 2021 at 10:01:53AM +0200, Francesco Dolcini wrote:
> Hello Greg,
> 
> On Thu, Oct 14, 2021 at 09:33:55AM +0200, Greg Kroah-Hartman wrote:
> > On Thu, Oct 14, 2021 at 09:10:52AM +0200, Francesco Dolcini wrote:
> > > From: Stefan Agner <stefan@agner.ch>
> > > 
> > > If the device used as a serial console gets un/re-binded, then
> > > register_console() will call imx_uart_setup_console() again.
> > > Drop __init so that imx_uart_setup_console() can be safely called
> > > at runtime.
> > > 
> > > Signed-off-by: Stefan Agner <stefan@agner.ch>
> > > Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
> > > ---
> > >  drivers/tty/serial/imx.c | 4 ++--
> > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > What commit does this "fix"?
> 
> root@colibri-imx6ull-06746657:~# cat /sys/devices/virtual/tty/console/active 
> tty1 ttymxc0
> root@colibri-imx6ull-06746657:~# echo -n N > /sys/devices/virtual/tty/console/subsystem/ttymxc0/console
> root@colibri-imx6ull-06746657:~# echo -n Y > /sys/devices/virtual/tty/console/subsystem/ttymxc0/console
> 
> struct console ->setup is called at that time, but imx_uart_console_setup() is gone ...

This specific way I described here to reproduce the issue was introduced with
 a3cb39d258ef serial: core: Allow detach and attach serial device for console

that is kernel 5.9+

(Andy added to to:)

But the original report was about bind/unbind of the uart driver, I guess this is possible since
way more time.

> 
> According to the original report from Stefan the issue is the same with unbind/bind of the console,
> see https://marc.info/?l=linux-serial&m=154221779312036&w=2.
> 
> 
> > Should this go to stable kernels?  If so, how far back?
> This is present also in 4.19 kernel, I feel like the issue is there since it is possible to unbind
> a console driver (since ever considering the current LTS releases?). I could
> investigate this a little bit more.
> 
> We have this patch in our kernel branch since 3 years but for some reason we never managed to upstream it.
> 
> 
> Francesco
diff mbox series

Patch

diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index 8b121cd869e9..51a9f9423b1a 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -2017,7 +2017,7 @@  imx_uart_console_write(struct console *co, const char *s, unsigned int count)
  * If the port was already initialised (eg, by a boot loader),
  * try to determine the current setup.
  */
-static void __init
+static void
 imx_uart_console_get_options(struct imx_port *sport, int *baud,
 			     int *parity, int *bits)
 {
@@ -2076,7 +2076,7 @@  imx_uart_console_get_options(struct imx_port *sport, int *baud,
 	}
 }
 
-static int __init
+static int
 imx_uart_console_setup(struct console *co, char *options)
 {
 	struct imx_port *sport;