[PATCH] Delay creation of khcvd thread - Kernel

This is a discussion on [PATCH] Delay creation of khcvd thread - Kernel ; This changes hvc_init() to be called only when someone actually uses the hvc_console driver. Dave Jones complained when profiling bootup. hvc_console used to only be for Power aka pSeries: now lguest and Xen both want it built-in in case the ...

+ Reply to Thread
Results 1 to 4 of 4

Thread: [PATCH] Delay creation of khcvd thread

  1. [PATCH] Delay creation of khcvd thread

    This changes hvc_init() to be called only when someone actually uses
    the hvc_console driver. Dave Jones complained when profiling bootup.

    hvc_console used to only be for Power aka pSeries: now lguest and Xen
    both want it built-in in case the kernel is a guest under one of
    those, even though usually it will be a native boot.

    Signed-off-by: Rusty Russell
    ---
    drivers/char/Kconfig | 8 ++---
    drivers/char/hvc_console.c | 66 ++++++++++++++++++++++++++++++--------------
    2 files changed, 49 insertions(+), 25 deletions(-)

    ================================================== =================
    --- a/drivers/char/Kconfig
    +++ b/drivers/char/Kconfig
    @@ -568,10 +568,10 @@ config HVC_DRIVER
    config HVC_DRIVER
    bool
    help
    - Users of pSeries machines that want to utilize the hvc console front-end
    - module for their backend console driver should select this option.
    + Generic "hypervisor virtual console" infrastructure for various
    + hypervisors (pSeries, Xen, lguest).
    It will automatically be selected if one of the back-end console drivers
    is selected.


    config HVC_CONSOLE
    ================================================== =================
    --- a/drivers/char/hvc_console.c
    +++ b/drivers/char/hvc_console.c
    @@ -68,6 +68,8 @@ static struct task_struct *hvc_task;

    /* Picks up late kicks after list walk but before schedule() */
    static int hvc_kicked;
    +
    +static int hvc_init(void);

    #ifdef CONFIG_MAGIC_SYSRQ
    static int sysrq_pressed;
    @@ -754,6 +756,13 @@ struct hvc_struct __devinit *hvc_alloc(u
    struct hvc_struct *hp;
    int i;

    + /* We wait until a driver actually comes along */
    + if (!hvc_driver) {
    + int err = hvc_init();
    + if (err)
    + return ERR_PTR(err);
    + }
    +
    hp = kmalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size,
    GFP_KERNEL);
    if (!hp)
    @@ -829,16 +838,18 @@ int __devexit hvc_remove(struct hvc_stru
    return 0;
    }

    -/* Driver initialization. Follow console initialization. This is where the TTY
    - * interfaces start to become available. */
    -static int __init hvc_init(void)
    +/* Driver initialization: called as soon as someone uses hvc_alloc(). */
    +static int hvc_init(void)
    {
    struct tty_driver *drv;
    + int err;

    /* We need more than hvc_count adapters due to hotplug additions. */
    drv = alloc_tty_driver(HVC_ALLOC_TTY_ADAPTERS);
    - if (!drv)
    - return -ENOMEM;
    + if (!drv) {
    + err = -ENOMEM;
    + goto out;
    + }

    drv->owner = THIS_MODULE;
    drv->driver_name = "hvc";
    @@ -854,30 +865,43 @@ static int __init hvc_init(void)
    * 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(drv);
    - return -EIO;
    - }
    -
    - if (tty_register_driver(drv))
    - panic("Couldn't register hvc console driver\n");
    -
    + printk(KERN_ERR "Couldn't create kthread for console.\n");
    + err = PTR_ERR(hvc_task);
    + goto put_tty;
    + }
    +
    + err = tty_register_driver(drv);
    + if (err) {
    + printk(KERN_ERR "Couldn't register hvc console driver\n");
    + goto stop_thread;
    + }
    +
    + /* FIXME: This mb() seems completely random. Remove it. */
    mb();
    hvc_driver = drv;
    return 0;
    -}
    -module_init(hvc_init);
    +
    +put_tty:
    + put_tty_driver(hvc_driver);
    +stop_thread:
    + kthread_stop(hvc_task);
    + hvc_task = NULL;
    +out:
    + return err;
    +}

    /* This isn't particularly necessary due to this being a console driver
    * but it is nice to be thorough.
    */
    static void __exit hvc_exit(void)
    {
    - kthread_stop(hvc_task);
    -
    - tty_unregister_driver(hvc_driver);
    - /* return tty_struct instances allocated in hvc_init(). */
    - put_tty_driver(hvc_driver);
    - unregister_console(&hvc_con_driver);
    + if (hvc_driver) {
    + kthread_stop(hvc_task);
    +
    + tty_unregister_driver(hvc_driver);
    + /* return tty_struct instances allocated in hvc_init(). */
    + put_tty_driver(hvc_driver);
    + unregister_console(&hvc_con_driver);
    + }
    }
    module_exit(hvc_exit);


    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  2. Re: [PATCH] Delay creation of khcvd thread

    On Tue, 25 Sep 2007 13:46:24 +1000 Rusty Russell wrote:
    >
    > hvc_console used to only be for Power aka pSeries: now lguest and Xen


    Also legacy iSeries :-)

    --
    Cheers,
    Stephen Rothwell sfr@canb.auug.org.au
    http://www.canb.auug.org.au/~sfr/

    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.6 (GNU/Linux)

    iD8DBQFG+IjvTgG2atn1QN8RAuU1AKCG8ej6WQRXxYc2xG2V5G M5251lGQCeK+bV
    +sxIBXXJXuX1Z4vtABAY6VU=
    =Bua5
    -----END PGP SIGNATURE-----


  3. Re: [PATCH] Delay creation of khcvd thread

    On Tue, 2007-09-25 at 14:04 +1000, Stephen Rothwell wrote:
    > On Tue, 25 Sep 2007 13:46:24 +1000 Rusty Russell wrote:
    > >
    > > hvc_console used to only be for Power aka pSeries: now lguest and Xen

    >
    > Also legacy iSeries :-)


    OK, how's this:
    ---
    HVC console is also used by iSeries, so add that to HVC_DRIVER help.

    Signed-off-by: Rusty Russell

    diff -r 85d39cbbd21c drivers/char/Kconfig
    --- a/drivers/char/Kconfig Tue Sep 25 14:23:07 2007 +1000
    +++ b/drivers/char/Kconfig Tue Sep 25 14:26:01 2007 +1000
    @@ -569,7 +569,7 @@ config HVC_DRIVER
    bool
    help
    Generic "hypervisor virtual console" infrastructure for various
    - hypervisors (pSeries, Xen, lguest).
    + hypervisors (pSeries, iSeries, Xen, lguest).
    It will automatically be selected if one of the back-end console drivers
    is selected.



    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  4. Re: [PATCH] Delay creation of khcvd thread

    Hi Rusty,

    On Tue, 25 Sep 2007 14:27:41 +1000 Rusty Russell wrote:
    >
    > HVC console is also used by iSeries, so add that to HVC_DRIVER help.
    >
    > Signed-off-by: Rusty Russell
    >
    > diff -r 85d39cbbd21c drivers/char/Kconfig
    > --- a/drivers/char/Kconfig Tue Sep 25 14:23:07 2007 +1000
    > +++ b/drivers/char/Kconfig Tue Sep 25 14:26:01 2007 +1000
    > @@ -569,7 +569,7 @@ config HVC_DRIVER
    > bool
    > help
    > Generic "hypervisor virtual console" infrastructure for various
    > - hypervisors (pSeries, Xen, lguest).
    > + hypervisors (pSeries, iSeries, Xen, lguest).
    > It will automatically be selected if one of the back-end console drivers
    > is selected.


    Acked-by: Stephen Rothwell

    ;-)
    --
    Cheers,
    Stephen Rothwell sfr@canb.auug.org.au
    http://www.canb.auug.org.au/~sfr/

    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.6 (GNU/Linux)

    iD8DBQFG+JF5TgG2atn1QN8RAgmcAJ0RvH1fZqBcYSGKcZMnzD KVZ6Hn5ACfav4l
    dPQu0PG5Z4nr6aEv6X632LA=
    =jQQ/
    -----END PGP SIGNATURE-----


+ Reply to Thread