[PATCH] HVC init race
Hollis Blanchard
hollis at penguinppc.org
Fri Nov 4 16:10:19 EST 2005
On Nov 3, 2005, at 11:02 PM, Michael Neuling wrote:
> I've been hitting a crash on boot where tty_open is being called
> before the
> hvc console driver setup is complete. Below patch fixes this problem.
What is the race exactly? I guess nothing should be calling into
hvc_open before tty_register_driver()...?
-Hollis
> drivers/char/hvc_console.c | 32 ++++++++++++++++++--------------
> 1 files changed, 18 insertions(+), 14 deletions(-)
>
> Index: linux-2.6/drivers/char/hvc_console.c
> ===================================================================
> --- linux-2.6.orig/drivers/char/hvc_console.c
> +++ linux-2.6/drivers/char/hvc_console.c
> @@ -823,34 +823,38 @@
> * interfaces start to become available. */
> int __init hvc_init(void)
> {
> + struct tty_driver *drv;
> +
> /* We need more than hvc_count adapters due to hotplug additions. */
> - hvc_driver = alloc_tty_driver(HVC_ALLOC_TTY_ADAPTERS);
> - if (!hvc_driver)
> + drv = alloc_tty_driver(HVC_ALLOC_TTY_ADAPTERS);
> + if (!drv)
> return -ENOMEM;
>
> - hvc_driver->owner = THIS_MODULE;
> - hvc_driver->devfs_name = "hvc/";
> - hvc_driver->driver_name = "hvc";
> - hvc_driver->name = "hvc";
> - hvc_driver->major = HVC_MAJOR;
> - hvc_driver->minor_start = HVC_MINOR;
> - hvc_driver->type = TTY_DRIVER_TYPE_SYSTEM;
> - hvc_driver->init_termios = tty_std_termios;
> - hvc_driver->flags = TTY_DRIVER_REAL_RAW;
> - tty_set_operations(hvc_driver, &hvc_ops);
> + drv->owner = THIS_MODULE;
> + drv->devfs_name = "hvc/";
> + drv->driver_name = "hvc";
> + drv->name = "hvc";
> + drv->major = HVC_MAJOR;
> + drv->minor_start = HVC_MINOR;
> + drv->type = TTY_DRIVER_TYPE_SYSTEM;
> + drv->init_termios = tty_std_termios;
> + drv->flags = TTY_DRIVER_REAL_RAW;
> + tty_set_operations(drv, &hvc_ops);
>
> /* Always start the kthread because there can be hotplug vty adapters
> * added later. */
> hvc_task = kthread_run(khvcd, NULL, "khvcd");
> if (IS_ERR(hvc_task)) {
> panic("Couldn't create kthread for console.\n");
> - put_tty_driver(hvc_driver);
> + put_tty_driver(drv);
> return -EIO;
> }
>
> - if (tty_register_driver(hvc_driver))
> + if (tty_register_driver(drv))
> panic("Couldn't register hvc console driver\n");
>
> + mb();
> + hvc_driver = drv;
> return 0;
> }
> module_init(hvc_init);
> _______________________________________________
> Linuxppc64-dev mailing list
> Linuxppc64-dev at ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc64-dev
>
More information about the Linuxppc64-dev
mailing list