On Tue, 24 Apr 2007, Oliver Neukum wrote:

> Am Dienstag, 24. April 2007 21:47 schrieb Alan Stern:
> > On Tue, 24 Apr 2007, Oliver Neukum wrote:
> > 
> > > Hi,
> > > 
> > > some drivers'll need a lockless method to alter the pm count in order
> > > to take locks by themselves in correct order.
> > 
> > (Minor comment: Acquiring the lock yourself to alter the pm count isn't
> > quite the same as doing it locklessly.)
> > 
> > Can you give an example where this would be needed?  I can't think of one 
> > offhand.
> 
> Certainly. I need this to do autosuspend for the storage driver.
> 
> usb_suspend()
> usb_pm_lock(udev)
> usb_suspend_both(udev)
> storage:
> storage_suspend()
> mutex_lock(&us->dev_mutex);
> 
> The storage thread:
> usb_stor_control_thread()
> mutex_lock(&(us->dev_mutex));
> usb_autopm_get_interface()
> 
> AB <-> BA deadlock

Yes, the problem is clear.  Presumably you want to change things to go
like this:

usb_storage_control_thread():
usb_pm_lock(us->pusb_dev);
mutex_lock(&us->dev_mutex);
if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) ...
__usb_autopm_get_interface();
usb_pm_unlock(us->pusb_dev);

Right?  I've been thinking about this exact same problem recently.  It
affect every USB driver, in principle.  You might prefer the approach I 
thought up; it involves adding a new mutex to struct us_data like so:

storage_suspend():
mutex_lock(&us->suspend_mutex);

usb_stor_control_thread():
mutex_lock(&us->dev_mutex);
if (test_bit(US_FLIDX_DISCONNECTING, &us->flags)) ...
usb_autopm_get_interface();
mutex_lock(&us->suspend_mutex);

Either way is awkward, but mine is a little cleaner.  What do you think? 

Another thing that should be changed in usb_storage: get rid of the
clumsy total_threads/threads_gone stuff and use kthread_stop() instead.

Alan Stern


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to