Re: [PATCH] USB: usbtest fix endless loop in unlink tests.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thursday 04 June 2009, Greg KH wrote:
> On Thu, Jun 04, 2009 at 11:20:38PM +0200, Martin Fuzzey wrote:
> > In tests 11 and 12 if the URB completes with an error status (eg babble)
> > the asynchrous unlink entered an endless loop trying to unlink
> > a non resubmitted URB.
> > 
> > Signed-off-by: Martin Fuzzey <mfuzzey@xxxxxxxxx>
> 
> David, any thoughts about this?

Looks plausible; go for it.


> 
> thanks,
> 
> greg k-h
> 
> 
> > 
> > ---
> > 
> >  drivers/usb/misc/usbtest.c |   39 +++++++++++++++++++++++++--------------
> >  1 files changed, 25 insertions(+), 14 deletions(-)
> > 
> > diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c
> > index 5f1a19d..a9f06d7 100644
> > --- a/drivers/usb/misc/usbtest.c
> > +++ b/drivers/usb/misc/usbtest.c
> > @@ -1072,23 +1072,34 @@ static int unlink1 (struct usbtest_dev *dev, int pipe, int size, int async)
> >  	 */
> >  	msleep (jiffies % (2 * INTERRUPT_RATE));
> >  	if (async) {
> > -retry:
> > -		retval = usb_unlink_urb (urb);
> > -		if (retval == -EBUSY || retval == -EIDRM) {
> > -			/* we can't unlink urbs while they're completing.
> > -			 * or if they've completed, and we haven't resubmitted.
> > -			 * "normal" drivers would prevent resubmission, but
> > -			 * since we're testing unlink paths, we can't.
> > -			 */
> > -			ERROR(dev,  "unlink retry\n");
> > -			goto retry;
> > +		while (!completion_done(&completion)) {
> > +			retval = usb_unlink_urb(urb);
> > +
> > +			switch (retval) {
> > +			case -EBUSY:
> > +			case -EIDRM:
> > +				/* we can't unlink urbs while they're completing
> > +				 * or if they've completed, and we haven't
> > +				 * resubmitted. "normal" drivers would prevent
> > +				 * resubmission, but since we're testing unlink
> > +				 * paths, we can't.
> > +				 */
> > +				ERROR(dev, "unlink retry\n");
> > +				continue;
> > +			case 0:
> > +			case -EINPROGRESS:
> > +				break;
> > +
> > +			default:
> > +				dev_err(&dev->intf->dev,
> > +					"unlink fail %d\n", retval);
> > +				return retval;
> > +			}
> > +
> > +			break;
> >  		}
> >  	} else
> >  		usb_kill_urb (urb);
> > -	if (!(retval == 0 || retval == -EINPROGRESS)) {
> > -		dev_err(&dev->intf->dev, "unlink fail %d\n", retval);
> > -		return retval;
> > -	}
> >  
> >  	wait_for_completion (&completion);
> >  	retval = urb->status;
> > 
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> > the body of a message to majordomo@xxxxxxxxxxxxxxx
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 


--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux