lkml.org 
[lkml]   [2007]   [Apr]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch] driver core: if built-in, do not wait in driver_unregister()

    * Linus Torvalds <torvalds@linux-foundation.org> wrote:

    > I would suggest that for 2.6.21, the minimal fix is actually something
    > like the appended. Comments? Ingo, does this fix things for you?

    yeah - it does the trick: i just booted the .config in question and your
    patch works fine and the bootup does not hang in slgt_init() anymore:

    Calling initcall 0xc1e78d86: slgt_init+0x0/0x1ee()
    SyncLink GT $Revision: 4.36 $
    SyncLink GT no devices found
    initcall 0xc1e78d86: slgt_init+0x0/0x1ee() returned -19
    Calling initcall 0xc1e78f74: n_hdlc_init+0x0/0x9c()
    HDLC line discipline: version $Revision: 4.8 $, maxframe=4096
    N_HDLC line discipline registered.
    initcall 0xc1e78f74: n_hdlc_init+0x0/0x9c() returned 0

    thanks! Find below the full patch with metadata filled in (no other
    changes).

    Ingo

    ------------------------->
    Subject: [patch] driver core: if built-in, do not wait in driver_unregister()
    From: Linus Torvalds <torvalds@linux-foundation.org>

    built-in drivers suffered bootup hangs with certain driver unregistry
    sequences, due to sysfs breakage.

    do the minimal fix for v2.6.21: only wait if the driver is a module.

    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    ---
    drivers/base/driver.c | 9 ++++++++-
    1 file changed, 8 insertions(+), 1 deletion(-)

    Index: linux/drivers/base/driver.c
    ===================================================================
    --- linux.orig/drivers/base/driver.c
    +++ linux/drivers/base/driver.c
    @@ -183,7 +183,14 @@ int driver_register(struct device_driver
    void driver_unregister(struct device_driver * drv)
    {
    bus_remove_driver(drv);
    - wait_for_completion(&drv->unloaded);
    + /*
    + * If the driver is a module, we are probably in
    + * the module unload path, and we want to wait
    + * for everything to unload before we can actually
    + * finish the unload.
    + */
    + if (drv->owner)
    + wait_for_completion(&drv->unloaded);
    }

    /**
    -
    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/
    \
     
     \ /
      Last update: 2007-04-01 19:39    [W:2.640 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site