Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

USB: pass mem_flags to dma_alloc_coherent

When I want to use my webcam, I get:

vvvvvvv
cheese: page allocation failure. order:5, mode:0x8004
Pid: 8100, comm: cheese Not tainted 2.6.30-rc2-wl-dirty #102
Call Trace:
[<ffffffff802c5d8e>] __alloc_pages_internal+0x3fe/0x520
[<ffffffff80210a20>] dma_generic_alloc_coherent+0x90/0x120
[<ffffffffa001c91e>] hcd_buffer_alloc+0xee/0x130 [usbcore]
[<ffffffffa000d52d>] usb_buffer_alloc+0x2d/0x40 [usbcore]
[<ffffffffa0160e14>] uvc_alloc_urb_buffers+0x84/0x140 [uvcvideo]
[<ffffffffa0160ff6>] uvc_init_video+0x126/0x400 [uvcvideo]
[...]

Oddly, I remembered fixing this and putting in __GFP_NOWARN
because uvcvideo retries a smaller allocation. However, the
allocation function doesn't pass the gfp flags through to
dma_alloc_coherent so we still get the warning!

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Johannes Berg and committed by
Greg Kroah-Hartman
a8aa401f 82a10a81

+1 -1
+1 -1
drivers/usb/core/buffer.c
··· 119 119 if (size <= pool_max [i]) 120 120 return dma_pool_alloc(hcd->pool [i], mem_flags, dma); 121 121 } 122 - return dma_alloc_coherent(hcd->self.controller, size, dma, 0); 122 + return dma_alloc_coherent(hcd->self.controller, size, dma, mem_flags); 123 123 } 124 124 125 125 void hcd_buffer_free(