[PATCH] Hold the device's parent's lock during probe and remove
authorAlan Stern <stern@rowland.harvard.edu>
Thu, 17 Nov 2005 21:54:12 +0000 (16:54 -0500)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 5 Jan 2006 00:18:08 +0000 (16:18 -0800)
commitbf74ad5bc41727d5f2f1c6bedb2c1fac394de731
tree1e46f41550a9fe6df40fedeace23f5aff656b478
parent6d20b035dee4300e9786c6e1cb77a765c7f9460a
[PATCH] Hold the device's parent's lock during probe and remove

This patch (as604) makes the driver core hold a device's parent's lock
as well as the device's lock during calls to the probe and remove
methods in a driver.  This facility is needed by USB device drivers,
owing to the peculiar way USB devices work:

A device provides multiple interfaces, and drivers are bound
to interfaces rather than to devices;

Nevertheless a reset, reset-configuration, suspend, or resume
affects the entire device and requires the caller to hold the
lock for the device, not just a lock for one of the interfaces.

Since a USB driver's probe method is always called with the interface
lock held, the locking order rules (always lock parent before child)
prevent these methods from acquiring the device lock.  The solution
provided here is to call all probe and remove methods, for all devices
(not just USB), with the parent lock already acquired.

Although currently only the USB subsystem requires these changes, people
have mentioned in prior discussion that the overhead of acquiring an
extra semaphore in all the prove/remove sequences is not overly large.

Up to now, the USB core has been using its own set of private
semaphores.  A followup patch will remove them, relying entirely on the
device semaphores provided by the driver core.

The code paths affected by this patch are:

device_add and device_del: The USB core already holds the parent
lock, so no actual change is needed.

driver_register and driver_unregister: The driver core will now
lock both the parent and the device before probing or removing.

driver_bind and driver_unbind (in sysfs): These routines will
now lock both the parent and the device before binding or
unbinding.

bus_rescan_devices: The helper routine will lock the parent
before probing a device.

I have not tested this patch for conflicts with other subsystems.  As
far as I can see, the only possibility of conflict would lie in the
bus_rescan_devices pathway, and it seems pretty remote.  Nevertheless,
it would be good for this to get a lot of testing in -mm.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/base/bus.c
drivers/base/dd.c