On Friday 10 January 2003 14:55, Oliver Neukum wrote:
> Am Freitag, 10. Januar 2003 13:21 schrieb Duncan Sands:
> > > I am afraid I do not agree. Your reasoning is correct only on UP.
> > > If the code in question runs on another CPU, you are in trouble.
> >
> > It all depends on the semantics of usb_unlink_urb.  Consider the
> > patch below.  Is this any better?  Maybe not: if usb_unlink_urb
> > returns before the completion handler (running on another CPU)
> > reaches the tasklet_schedule statement, then what is to stop
> > the tasklet being scheduled by the completion handler after the
> > tasklet_kill?  Nothing.  So it all depends on whether or
> > not usb_unlink_urb guarantees that the completion handler has
> > finished running before it (usb_unlink_urb) returns.
>
>       if (urb->status != -EINPROGRESS) {
>               retval = -EBUSY;
>               goto done;
>       }
> from hcd.c
>
> So, usb_unlink_urb() will explicitely return if the completion handler
> is running. To be safe you need something like:
>
> (in disconnect() )
> spin_lock_irq(...);
> descriptor->disconnected = 1;
> tasklet_kill(...);
> spin_unlock_irq(...);
>
> (in the completion handler)
> spin_lock(...);
> if (!descriptor->disconnected)
>       tasklet_schedule(...);
> spin_unlock(...);

Hi Oliver, thanks for the suggestion.  It is not quite so simple because you also
have to deal with the private data ("instance") being kfreed soon afterwards (see
udsl_usb_disconnect).  Anyway, I will take care of it.

Ciao, Duncan.

PS: I won't be around until the end of next week, so don't expect a patch before then.


-------------------------------------------------------
This SF.NET email is sponsored by:
SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
http://www.vasoftware.com
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to