projects/linux·commit f5ef2abc

driver core: do not wait unnecessarily in driver_unregister()

f5ef2abc · Linus Torvalds <[email protected]> · 2007-04-01 10:54:13 -07:00

Ingo reported that 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.

Acked-by: Ingo Molnar <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Commit
f5ef2abcbeb5b0be23f7cc610a024b2406e3d8e6
Parents
755948cf

Changes

1 files changed · +8 −1

FileStatusAddDelContent
drivers/base/driver.cmodified+8−1View file

drivers/base/driver.c

View file
diff --git a/drivers/base/driver.c b/drivers/base/driver.c
index 1214cbd..082bfde 100644
--- a/drivers/base/driver.c
+++ b/drivers/base/driver.c
@@ -183,7 +183,14 @@ int driver_register(struct device_driver * drv)
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);
}
/**