Skip to content

Commit

Permalink
USB: usbtest: add a timeout for scatter-gather tests
Browse files Browse the repository at this point in the history
In usbtest, tests 5 - 8 use the scatter-gather library in usbcore
without any sort of timeout.  If there's a problem in the gadget or
host controller being tested, the test can hang.

This patch adds a 10-second timeout to the tests, so that they will
fail gracefully with an ETIMEDOUT error instead of hanging.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Reported-by: Huang Rui <ray.huang@amd.com>
Tested-by: Huang Rui <ray.huang@amd.com>
CC: <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Alan Stern authored and Greg Kroah-Hartman committed Jun 18, 2014
1 parent b0a50e9 commit 32b36ee
Showing 1 changed file with 15 additions and 1 deletion.
16 changes: 15 additions & 1 deletion drivers/usb/misc/usbtest.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#include <linux/moduleparam.h>
#include <linux/scatterlist.h>
#include <linux/mutex.h>

#include <linux/timer.h>
#include <linux/usb.h>

#define SIMPLE_IO_TIMEOUT 10000 /* in milliseconds */
Expand Down Expand Up @@ -484,6 +484,14 @@ alloc_sglist(int nents, int max, int vary)
return sg;
}

static void sg_timeout(unsigned long _req)
{
struct usb_sg_request *req = (struct usb_sg_request *) _req;

req->status = -ETIMEDOUT;
usb_sg_cancel(req);
}

static int perform_sglist(
struct usbtest_dev *tdev,
unsigned iterations,
Expand All @@ -495,6 +503,9 @@ static int perform_sglist(
{
struct usb_device *udev = testdev_to_usbdev(tdev);
int retval = 0;
struct timer_list sg_timer;

setup_timer_on_stack(&sg_timer, sg_timeout, (unsigned long) req);

while (retval == 0 && iterations-- > 0) {
retval = usb_sg_init(req, udev, pipe,
Expand All @@ -505,7 +516,10 @@ static int perform_sglist(

if (retval)
break;
mod_timer(&sg_timer, jiffies +
msecs_to_jiffies(SIMPLE_IO_TIMEOUT));
usb_sg_wait(req);
del_timer_sync(&sg_timer);
retval = req->status;

/* FIXME check resulting data pattern */
Expand Down

0 comments on commit 32b36ee

Please sign in to comment.