The patch number 8208 was added via Mauro Carvalho Chehab <[EMAIL PROTECTED]>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        [EMAIL PROTECTED]

------

From: Laurent Pinchart  <[EMAIL PROTECTED]>
uvcvideo: Use GFP_NOIO when allocating memory during resume


The swap device might still be asleep, so memory allocated in the resume
handler must use GFP_NOIO. Thanks to Oliver Neukum for catching and reporting
this bug.

Signed-off-by: Laurent Pinchart <[EMAIL PROTECTED]>
Signed-off-by: Mauro Carvalho Chehab <[EMAIL PROTECTED]>


---

 linux/drivers/media/video/uvc/uvc_status.c |    6 ++--
 linux/drivers/media/video/uvc/uvc_video.c  |   28 ++++++++++-----------
 2 files changed, 17 insertions(+), 17 deletions(-)

diff -r 59224fdb6877 -r 07c29bcc1199 linux/drivers/media/video/uvc/uvc_status.c
--- a/linux/drivers/media/video/uvc/uvc_status.c        Fri Jul 04 00:34:59 
2008 +0000
+++ b/linux/drivers/media/video/uvc/uvc_status.c        Fri Jul 04 00:35:26 
2008 +0000
@@ -203,6 +203,6 @@ int uvc_status_resume(struct uvc_device 
        if (dev->int_urb == NULL)
                return 0;
 
-       return usb_submit_urb(dev->int_urb, GFP_KERNEL);
-}
-
+       return usb_submit_urb(dev->int_urb, GFP_NOIO);
+}
+
diff -r 59224fdb6877 -r 07c29bcc1199 linux/drivers/media/video/uvc/uvc_video.c
--- a/linux/drivers/media/video/uvc/uvc_video.c Fri Jul 04 00:34:59 2008 +0000
+++ b/linux/drivers/media/video/uvc/uvc_video.c Fri Jul 04 00:35:26 2008 +0000
@@ -586,7 +586,7 @@ static void uvc_uninit_video(struct uvc_
  * is given by the endpoint.
  */
 static int uvc_init_video_isoc(struct uvc_video_device *video,
-       struct usb_host_endpoint *ep)
+       struct usb_host_endpoint *ep, gfp_t gfp_flags)
 {
        struct urb *urb;
        unsigned int npackets, i, j;
@@ -611,14 +611,14 @@ static int uvc_init_video_isoc(struct uv
        size = npackets * psize;
 
        for (i = 0; i < UVC_URBS; ++i) {
-               urb = usb_alloc_urb(npackets, GFP_KERNEL);
+               urb = usb_alloc_urb(npackets, gfp_flags);
                if (urb == NULL) {
                        uvc_uninit_video(video);
                        return -ENOMEM;
                }
 
                video->urb_buffer[i] = usb_buffer_alloc(video->dev->udev,
-                       size, GFP_KERNEL, &urb->transfer_dma);
+                       size, gfp_flags, &urb->transfer_dma);
                if (video->urb_buffer[i] == NULL) {
                        usb_free_urb(urb);
                        uvc_uninit_video(video);
@@ -652,7 +652,7 @@ static int uvc_init_video_isoc(struct uv
  * given by the endpoint.
  */
 static int uvc_init_video_bulk(struct uvc_video_device *video,
-       struct usb_host_endpoint *ep)
+       struct usb_host_endpoint *ep, gfp_t gfp_flags)
 {
        struct urb *urb;
        unsigned int pipe, i;
@@ -674,14 +674,14 @@ static int uvc_init_video_bulk(struct uv
        pipe = usb_rcvbulkpipe(video->dev->udev, ep->desc.bEndpointAddress);
 
        for (i = 0; i < UVC_URBS; ++i) {
-               urb = usb_alloc_urb(0, GFP_KERNEL);
+               urb = usb_alloc_urb(0, gfp_flags);
                if (urb == NULL) {
                        uvc_uninit_video(video);
                        return -ENOMEM;
                }
 
                video->urb_buffer[i] = usb_buffer_alloc(video->dev->udev,
-                       size, GFP_KERNEL, &urb->transfer_dma);
+                       size, gfp_flags, &urb->transfer_dma);
                if (video->urb_buffer[i] == NULL) {
                        usb_free_urb(urb);
                        uvc_uninit_video(video);
@@ -702,7 +702,7 @@ static int uvc_init_video_bulk(struct uv
 /*
  * Initialize isochronous/bulk URBs and allocate transfer buffers.
  */
-static int uvc_init_video(struct uvc_video_device *video)
+static int uvc_init_video(struct uvc_video_device *video, gfp_t gfp_flags)
 {
        struct usb_interface *intf = video->streaming->intf;
        struct usb_host_interface *alts;
@@ -747,7 +747,7 @@ static int uvc_init_video(struct uvc_vid
                if ((ret = usb_set_interface(video->dev->udev, intfnum, i)) < 0)
                        return ret;
 
-               ret = uvc_init_video_isoc(video, ep);
+               ret = uvc_init_video_isoc(video, ep, gfp_flags);
        } else {
                /* Bulk endpoint, proceed to URB initialization. */
                ep = uvc_find_endpoint(&intf->altsetting[0],
@@ -755,7 +755,7 @@ static int uvc_init_video(struct uvc_vid
                if (ep == NULL)
                        return -EIO;
 
-               ret = uvc_init_video_bulk(video, ep);
+               ret = uvc_init_video_bulk(video, ep, gfp_flags);
        }
 
        if (ret < 0)
@@ -763,7 +763,7 @@ static int uvc_init_video(struct uvc_vid
 
        /* Submit the URBs. */
        for (i = 0; i < UVC_URBS; ++i) {
-               if ((ret = usb_submit_urb(video->urb[i], GFP_KERNEL)) < 0) {
+               if ((ret = usb_submit_urb(video->urb[i], gfp_flags)) < 0) {
                        uvc_printk(KERN_ERR, "Failed to submit URB %u "
                                        "(%d).\n", i, ret);
                        uvc_uninit_video(video);
@@ -818,7 +818,7 @@ int uvc_video_resume(struct uvc_video_de
        if (!uvc_queue_streaming(&video->queue))
                return 0;
 
-       if ((ret = uvc_init_video(video)) < 0)
+       if ((ret = uvc_init_video(video, GFP_NOIO)) < 0)
                uvc_queue_enable(&video->queue, 0);
 
        return ret;
@@ -930,6 +930,6 @@ int uvc_video_enable(struct uvc_video_de
        if ((ret = uvc_queue_enable(&video->queue, 1)) < 0)
                return ret;
 
-       return uvc_init_video(video);
-}
-
+       return uvc_init_video(video, GFP_KERNEL);
+}
+


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/07c29bcc1199bdf24dcdcd5d1e259f3361dcaa40

_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to