Hi,
here's the patch that introduces a buffer for usb_control_msg
and fixes memory allocations in danger of deadlocking in usb.c
What do you think ?
Regards
Oliver
--- include/linux/usb.h.alt Sun Dec 9 13:49:56 2001
+++ include/linux/usb.h Wed Dec 12 00:19:26 2001
@@ -617,6 +617,9 @@
/* [0] = IN, [1] = OUT */
int epmaxpacketin[16]; /* INput endpoint specific maximums */
int epmaxpacketout[16]; /* OUTput endpoint specific maximums */
+
+ devrequest dr; /* scratch buffer for control messages */
+ struct semaphore dr_lock; /* lock for it */
struct usb_device *parent;
struct usb_bus *bus; /* Bus we're part of */
--- drivers/usb/usb.c.alt Thu Dec 6 22:12:55 2001
+++ drivers/usb/usb.c Wed Dec 12 00:22:54 2001
@@ -946,6 +946,7 @@
INIT_LIST_HEAD(&dev->filelist);
init_MUTEX(&dev->serialize);
+ init_MUTEX(&dev->dr_lock);
dev->bus->op->allocate(dev);
@@ -990,7 +991,7 @@
urb_t *urb;
urb = (urb_t *)kmalloc(sizeof(urb_t) + iso_packets *
sizeof(iso_packet_descriptor_t),
- in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
+ GFP_ATOMIC );
if (!urb) {
err("alloc_urb: kmalloc failed");
return NULL;
@@ -1154,23 +1155,20 @@
int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, __u8
requesttype,
__u16 value, __u16 index, void *data, __u16 size, int timeout)
{
- devrequest *dr = kmalloc(sizeof(devrequest), GFP_KERNEL);
int ret;
-
- if (!dr)
- return -ENOMEM;
+ devrequest *dr = &dev->dr;
+ down(&dev->dr_lock);
dr->requesttype = requesttype;
dr->request = request;
dr->value = cpu_to_le16p(&value);
dr->index = cpu_to_le16p(&index);
dr->length = cpu_to_le16p(&size);
- //dbg("usb_control_msg");
+ //dbg("usb_control_msg");
ret = usb_internal_control_msg(dev, pipe, dr, data, size, timeout);
-
- kfree(dr);
+ up(&dev->dr_lock);
return ret;
}
@@ -1913,7 +1911,7 @@
if (result < 0)
return result;
- buffer = kmalloc(sizeof(status), GFP_KERNEL);
+ buffer = kmalloc(sizeof(status), GFP_NOIO); /* possible use by usb-storage */
if (!buffer) {
err("unable to allocate memory for configuration descriptors");
return -ENOMEM;
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel