On Tue, 8 May 2007, Oliver Neukum wrote:

> Am Dienstag, 8. Mai 2007 18:59 schrieb Alan Stern:
> > But first, I think we should be able to get rid of the skel_open_lock
> > mutex plus similar mutexes in other USB drivers.  The problem they address
> > is the race between open() and disconnect() -- or more accurately, open()
> > and unregister_dev().  It should be fixed once and for all in usbcore.  
> > And without relying on the BKL.
> > 
> > How do you like this approach?
> 
> 1. An rwsem is likely overkill.

Why do you say that?  Think about what we need to accomplish:

        There must be no calls, either new or outstanding, to the
        driver's open() method after usb_unregister_dev() returns.

This means:

        All calls to usb_open() in file.c which started before
        usb_unregister_dev() was called, must complete before
        usb_unregister_dev() returns.

This could be done using SRCU, but an rwsem is simpler and easier to 
understand.  It could be done using a mutex, but then you couldn't have 
multiple simultaneous open() calls.

Simply changing the spinlock into an rwsem seems to be by far the best
solution, IMO.

> 2. I would prefer to have exclusion between open and reset, too.

Why?  I can understand wanting exclusion between read/write and reset.  
But there's no obvious reason to make open and reset exclusive.


Oh yes, there's one other thing you need to know.  I haven't documented it
yet, and so far it exists only as part of a patch in Greg's input queue:

        http://marc.info/?l=linux-usb-devel&m=117580359813254&w=2

so it's understandable that you're not aware of it.  :-)

        In certain error paths, suspend() can be paired with
        post_reset() instead of with resume().  post_reset() will
        get a second argument to indicate such events, which I
        call reset-resumes.

This will happen with devices that have USB_QUIRK_RESET_RESUME set,
meaning that they have to be reset after being suspended (like that audio
device from a few months ago).  It will also happen with the USB-persist
facility, in cases where power to the host controller was lost during
suspend.

There's actually quite a lot of overlap between suspend() and pre_reset() 
as well as between resume() and post_reset().  In fact, I would expect in 
many drivers the suspend() and pre_reset() method pointers could point to 
the same subroutine, which would need only to quiesce the driver.

Likewise, resume() and post_reset() need to activate the driver.  However
post_reset() may need to do a little more, because it may have to restore
any device state that got lost during the reset.

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