From: Sam Bishop <[EMAIL PROTECTED]> This patch adds a limit on the number of URBs in flight, per device, and the size of temporary write buffers.
Signed-off-by: Sam Bishop <[EMAIL PROTECTED]> --- I've had a 2.6 development box set up where I've tested both the email formatting and the patch. Hopefully this works better for you. --- linux-2.6.14.4/drivers/usb/usb-skeleton.c.orig 2005-12-14 16:50:41.000000000 -0700 +++ linux-2.6.14.4/drivers/usb/usb-skeleton.c 2005-12-16 20:27:37.656219376 -0700 @@ -1,5 +1,5 @@ /* - * USB Skeleton driver - 2.0 + * USB Skeleton driver - 2.1 * * Copyright (C) 2001-2004 Greg Kroah-Hartman ([EMAIL PROTECTED]) * @@ -8,8 +8,7 @@ * published by the Free Software Foundation, version 2. * * This driver is based on the 2.6.3 version of drivers/usb/usb-skeleton.c - * but has been rewritten to be easy to read and use, as no locks are now - * needed anymore. + * but has been rewritten to be easier to read and use. * */ @@ -39,6 +38,10 @@ MODULE_DEVICE_TABLE (usb, skel_table); /* Get a minor range for your devices from the usb maintainer */ #define USB_SKEL_MINOR_BASE 192 +/* You may want to modify these to better match your device */ +#define MAX_WRITE_URBS 4 +#define MAX_WRITE_BYTES (4 * 1024) /* number of bytes per write urb */ + /* Structure to hold all of our device specific stuff */ struct usb_skel { struct usb_device * udev; /* the usb device for this device */ @@ -48,6 +51,7 @@ struct usb_skel { __u8 bulk_in_endpointAddr; /* the address of the bulk in endpoint */ __u8 bulk_out_endpointAddr; /* the address of the bulk out endpoint */ struct kref kref; + struct semaphore avail_write_urbs; }; #define to_skel_dev(d) container_of(d, struct usb_skel, kref) @@ -152,6 +156,7 @@ static void skel_write_bulk_callback(str /* free up our allocated buffer */ usb_buffer_free(urb->dev, urb->transfer_buffer_length, urb->transfer_buffer, urb->transfer_dma); + up(&dev->avail_write_urbs); } static ssize_t skel_write(struct file *file, const char *user_buffer, size_t count, loff_t *ppos) @@ -167,6 +172,12 @@ static ssize_t skel_write(struct file *f if (count == 0) goto exit; + /* make sure that we haven't exceeded our self-imposed urb quota */ + if (down_interruptible(&dev->avail_write_urbs)) { + retval = -ERESTARTSYS; + goto exit; + } + /* create a urb, and a buffer for it, and copy the data to the urb */ urb = usb_alloc_urb(0, GFP_KERNEL); if (!urb) { @@ -174,6 +185,7 @@ static ssize_t skel_write(struct file *f goto error; } + count = min(count, (size_t)MAX_WRITE_BYTES); buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma); if (!buf) { retval = -ENOMEM; @@ -207,6 +219,7 @@ exit: error: usb_buffer_free(dev->udev, count, buf, urb->transfer_dma); usb_free_urb(urb); + up(&dev->avail_write_urbs); return retval; } @@ -246,6 +259,7 @@ static int skel_probe(struct usb_interfa } memset(dev, 0x00, sizeof(*dev)); kref_init(&dev->kref); + sema_init(&dev->avail_write_urbs, MAX_WRITE_URBS); dev->udev = usb_get_dev(interface_to_usbdev(interface)); dev->interface = interface; ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel