diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-04-01 13:54:13 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-04-01 13:54:13 -0400 |
commit | f5ef2abcbeb5b0be23f7cc610a024b2406e3d8e6 (patch) | |
tree | f0ded5f4a61f4db25794d097725e1d37d872c80c /drivers/base/driver.c | |
parent | 755948cfca16c71b16e8ff4a9d4dd31b1c0bf923 (diff) |
driver core: do not wait unnecessarily in driver_unregister()
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 <mingo@elte.hu>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/base/driver.c')
-rw-r--r-- | drivers/base/driver.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/base/driver.c b/drivers/base/driver.c index 1214cbd17d86..082bfded3854 100644 --- a/drivers/base/driver.c +++ b/drivers/base/driver.c | |||
@@ -183,7 +183,14 @@ int driver_register(struct device_driver * drv) | |||
183 | void driver_unregister(struct device_driver * drv) | 183 | void driver_unregister(struct device_driver * drv) |
184 | { | 184 | { |
185 | bus_remove_driver(drv); | 185 | bus_remove_driver(drv); |
186 | wait_for_completion(&drv->unloaded); | 186 | /* |
187 | * If the driver is a module, we are probably in | ||
188 | * the module unload path, and we want to wait | ||
189 | * for everything to unload before we can actually | ||
190 | * finish the unload. | ||
191 | */ | ||
192 | if (drv->owner) | ||
193 | wait_for_completion(&drv->unloaded); | ||
187 | } | 194 | } |
188 | 195 | ||
189 | /** | 196 | /** |