RE: [PATCH 2/2] V4L/DVB: buf-dma-sg.c: support non-pageable user-allocated memory

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Arnout,

Just a very minor style comment.

> -----Original Message-----
> From: linux-media-owner@xxxxxxxxxxxxxxx [mailto:linux-media-
> owner@xxxxxxxxxxxxxxx] On Behalf Of Arnout Vandecappelle
> Sent: Wednesday, March 17, 2010 5:53 PM
> To: linux-media@xxxxxxxxxxxxxxx; mchehab@xxxxxxxxxxxxx; arnout@xxxxxxx
> Subject: [PATCH 2/2] V4L/DVB: buf-dma-sg.c: support non-pageable user-
> allocated memory
> 
> videobuf_dma_init_user_locked() uses get_user_pages() to get the
> virtual-to-physical address mapping for user-allocated memory.
> However, the user-allocated memory may be non-pageable because it
> is an I/O range or similar.  get_user_pages() fails with -EFAULT
> in that case.
> 
> If the user-allocated memory is physically contiguous, the approach
> of V4L2_MEMORY_OVERLAY can be used.  If it is not, -EFAULT is still
> returned.
> ---
>  drivers/media/video/videobuf-dma-sg.c |   18 ++++++++++++++++++
>  1 files changed, 18 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/media/video/videobuf-dma-sg.c
> b/drivers/media/video/videobuf-dma-sg.c
> index 18aaf54..bd2d95d 100644
> --- a/drivers/media/video/videobuf-dma-sg.c
> +++ b/drivers/media/video/videobuf-dma-sg.c
> @@ -136,6 +136,7 @@ static int videobuf_dma_init_user_locked(struct
> videobuf_dmabuf *dma,
>  {
>  	unsigned long first,last;
>  	int err, rw = 0;
> +	struct vm_area_struct *vma;
> 
>  	dma->direction = direction;
>  	switch (dma->direction) {
> @@ -153,6 +154,23 @@ static int videobuf_dma_init_user_locked(struct
> videobuf_dmabuf *dma,
>  	last  = ((data+size-1) & PAGE_MASK) >> PAGE_SHIFT;
>  	dma->offset   = data & ~PAGE_MASK;
>  	dma->nr_pages = last-first+1;
> +
> +	/* In case the buffer is user-allocated and is actually an IO buffer
> for
> +	   some other hardware, we cannot map pages for it.  It in fact
> behaves
> +	   the same as an overlay. */

> +	vma = find_vma (current->mm, data);

Remove space before parenthesis above, so it becomes:

	vma = find_vma(current->mm, data);

Regards,
Sergio

> +	if (vma && (vma->vm_flags & VM_IO)) {
> +		/* Only a single contiguous buffer is supported. */
> +		if (vma->vm_end < data + size) {
> +			dprintk(1, "init user: non-contiguous IO buffer.\n");
> +			return -EFAULT; /* same error that get_user_pages()
> would give */
> +		}
> +		dma->bus_addr = (vma->vm_pgoff << PAGE_SHIFT) +	(data - vma-
> >vm_start);
> +		dprintk(1,"init user IO [0x%lx+0x%lx => %d pages at 0x%x]\n",
> +			data, size, dma->nr_pages, dma->bus_addr);
> +		return 0;
> +	}
> +
>  	dma->pages = kmalloc(dma->nr_pages * sizeof(struct page*),
>  			     GFP_KERNEL);
>  	if (NULL == dma->pages)
> --
> 1.6.3.3
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux