Re: [PATCH v3] media: uvc: don't do DMA on stack
From: Alan Stern <stern@rowland.harvard.edu>
Date: 2021-06-22 13:29:32
Also in:
linux-media, linux-usb, lkml
On Tue, Jun 22, 2021 at 08:07:12AM +0000, David Laight wrote:
From: Mauro Carvalho Chehabquoted
Sent: 21 June 2021 14:40 As warned by smatch: drivers/media/usb/uvc/uvc_v4l2.c:911 uvc_ioctl_g_input() error: doing dma on the stack (&i) drivers/media/usb/uvc/uvc_v4l2.c:943 uvc_ioctl_s_input() error: doing dma on the stack (&i) those two functions call uvc_query_ctrl passing a pointer to a data at the DMA stack. those are used to send URBs via usb_control_msg(). Using DMA stack is not supported and should not work anymore on modern Linux versions. So, use a kmalloc'ed buffer....quoted
+ buf = kmalloc(1, GFP_KERNEL); + if (!buf) + return -ENOMEM; + ret = uvc_query_ctrl(chain->dev, UVC_GET_CUR, chain->selector->id, chain->dev->intfnum, UVC_SU_INPUT_SELECT_CONTROL, - &i, 1); + buf, 1);Thought... Is kmalloc(1, GFP_KERNEL) guaranteed to return a pointer into a cache line that will not be accessed by any other code? (This is slightly weaker than requiring a cache-line aligned pointer - but very similar.)
As I understand it, on architectures that do not have cache-coherent I/O, kmalloc is guaranteed to return a buffer that is cacheline-aligned and whose length is a multiple of the cacheline size. Now, whether that buffer ends up being accessed by any other code depends on what your driver does with the pointer it gets from kmalloc. :-) Alan Stern
Without that guarantee you can't use the returned buffer for read dma unless the memory accesses are coherent. David