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 |
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
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
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
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
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 --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;