public inbox for linux-usb@vger.kernel.org
 help / color / mirror / Atom feed
* RE: [PATCH v3] media: uvc: don't do DMA on stack
       [not found] <6832dffafd54a6a95b287c4a1ef30250d6b9237a.1624282817.git.mchehab+huawei@kernel.org>
@ 2021-06-22  8:07 ` David Laight
  2021-06-22 10:12   ` Greg KH
  2021-06-22 13:29   ` Alan Stern
  0 siblings, 2 replies; 5+ messages in thread
From: David Laight @ 2021-06-22  8:07 UTC (permalink / raw)
  To: 'Mauro Carvalho Chehab', linux-usb@vger.kernel.org
  Cc: linuxarm@huawei.com, mauro.chehab@huawei.com, Laurent Pinchart,
	Mauro Carvalho Chehab, linux-kernel@vger.kernel.org,
	linux-media@vger.kernel.org, stable@vger.kernel.org

From: Mauro Carvalho Chehab
> 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.
...
> +	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.)

Without that guarantee you can't use the returned buffer for
read dma unless the memory accesses are coherent.

	David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3] media: uvc: don't do DMA on stack
  2021-06-22  8:07 ` [PATCH v3] media: uvc: don't do DMA on stack David Laight
@ 2021-06-22 10:12   ` Greg KH
  2021-06-22 13:29   ` Alan Stern
  1 sibling, 0 replies; 5+ messages in thread
From: Greg KH @ 2021-06-22 10:12 UTC (permalink / raw)
  To: David Laight
  Cc: 'Mauro Carvalho Chehab', linux-usb@vger.kernel.org,
	linuxarm@huawei.com, mauro.chehab@huawei.com, Laurent Pinchart,
	Mauro Carvalho Chehab, linux-kernel@vger.kernel.org,
	linux-media@vger.kernel.org, stable@vger.kernel.org

On Tue, Jun 22, 2021 at 08:07:12AM +0000, David Laight wrote:
> From: Mauro Carvalho Chehab
> > 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.
> ...
> > +	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.)
> 
> Without that guarantee you can't use the returned buffer for
> read dma unless the memory accesses are coherent.

For USB buffers, that should be fine, we have been doing this for
decades now...

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3] media: uvc: don't do DMA on stack
  2021-06-22  8:07 ` [PATCH v3] media: uvc: don't do DMA on stack David Laight
  2021-06-22 10:12   ` Greg KH
@ 2021-06-22 13:29   ` Alan Stern
  2021-06-22 14:21     ` David Laight
  1 sibling, 1 reply; 5+ messages in thread
From: Alan Stern @ 2021-06-22 13:29 UTC (permalink / raw)
  To: David Laight
  Cc: 'Mauro Carvalho Chehab', linux-usb@vger.kernel.org,
	linuxarm@huawei.com, mauro.chehab@huawei.com, Laurent Pinchart,
	Mauro Carvalho Chehab, linux-kernel@vger.kernel.org,
	linux-media@vger.kernel.org, stable@vger.kernel.org

On Tue, Jun 22, 2021 at 08:07:12AM +0000, David Laight wrote:
> From: Mauro Carvalho Chehab
> > 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.
> ...
> > +	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

^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: [PATCH v3] media: uvc: don't do DMA on stack
  2021-06-22 13:29   ` Alan Stern
@ 2021-06-22 14:21     ` David Laight
  2021-06-22 19:58       ` 'Alan Stern'
  0 siblings, 1 reply; 5+ messages in thread
From: David Laight @ 2021-06-22 14:21 UTC (permalink / raw)
  To: 'Alan Stern'
  Cc: 'Mauro Carvalho Chehab', linux-usb@vger.kernel.org,
	linuxarm@huawei.com, mauro.chehab@huawei.com, Laurent Pinchart,
	Mauro Carvalho Chehab, linux-kernel@vger.kernel.org,
	linux-media@vger.kernel.org, stable@vger.kernel.org

From: Alan Stern
> Sent: 22 June 2021 14:29
...
> > 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.  :-)

Thanks for the clarification.

Most of the small allocates in the usb stack are for transmits
where it is only necessary to ensure a cache write-back.

I know there has been some confusion because one of the
allocators can add a small header to every allocation.
This can lead to unexpectedly inadequately aligned pointers.
If it is updated when the preceding block is freed (as some
user-space mallocs do) then it would need to be in a
completely separate cache line.

	David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3] media: uvc: don't do DMA on stack
  2021-06-22 14:21     ` David Laight
@ 2021-06-22 19:58       ` 'Alan Stern'
  0 siblings, 0 replies; 5+ messages in thread
From: 'Alan Stern' @ 2021-06-22 19:58 UTC (permalink / raw)
  To: David Laight
  Cc: 'Mauro Carvalho Chehab', linux-usb@vger.kernel.org,
	linuxarm@huawei.com, mauro.chehab@huawei.com, Laurent Pinchart,
	Mauro Carvalho Chehab, linux-kernel@vger.kernel.org,
	linux-media@vger.kernel.org, stable@vger.kernel.org

On Tue, Jun 22, 2021 at 02:21:27PM +0000, David Laight wrote:
> From: Alan Stern
> > Sent: 22 June 2021 14:29
> ...
> > > 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.  :-)
> 
> Thanks for the clarification.
> 
> Most of the small allocates in the usb stack are for transmits
> where it is only necessary to ensure a cache write-back.
> 
> I know there has been some confusion because one of the
> allocators can add a small header to every allocation.
> This can lead to unexpectedly inadequately aligned pointers.
> If it is updated when the preceding block is freed (as some
> user-space mallocs do) then it would need to be in a
> completely separate cache line.

If you really want to find out what the true story is, you should ask 
on the linux-mm mailing list.  The rest of us are not experts on this 
stuff.

Alan Stern

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-06-22 19:58 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <6832dffafd54a6a95b287c4a1ef30250d6b9237a.1624282817.git.mchehab+huawei@kernel.org>
2021-06-22  8:07 ` [PATCH v3] media: uvc: don't do DMA on stack David Laight
2021-06-22 10:12   ` Greg KH
2021-06-22 13:29   ` Alan Stern
2021-06-22 14:21     ` David Laight
2021-06-22 19:58       ` 'Alan Stern'

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox