videobuf2/videobuf2-dma-sg.c: Convert to use vm_map_pages()
Subsystems (3)
PATCH v4 7/9 videobuf2/videobuf2-dma-sg.c: Convert to use vm_map_pages()
Convert to use vm_map_pages() to map range of kernel memory to user vma.
vm_pgoff is treated in V4L2 API as a 'cookie' to select a buffer, not as a in-buffer offset by design and it always want to mmap a whole buffer from its beginning.
Signed-off-by Souptick Joarder <[email protected]>
Suggested-by Marek Szyprowski <[email protected]>
Reviewed-by Marek Szyprowski <[email protected]>
--- drivers/media/common/videobuf2/videobuf2-core.c | 7 +++++++ .../media/common/videobuf2/videobuf2-dma-contig.c | 6 ------ drivers/media/common/videobuf2/videobuf2-dma-sg.c | 22 ++++++---------------- 3 files changed, 13 insertions(+), 22 deletions(-)
drivers/media/common/videobuf2/videobuf2-core.c +7 -0
@@ -2175,6 +2175,13 @@ int vb2_mmap(struct vb2_queue *q, struct vm_area_struct *vma) goto unlock; } +/* +* vm_pgoff is treated in V4L2 API as a 'cookie' to select a buffer, +* not as a in-buffer offset. We always want to mmap a whole buffer +* from its beginning. +*/ + vma->vm_pgoff =0 ; + ret =call_memop (vb, mmap, vb->planes[plane].mem_priv, vma); unlock:
drivers/media/common/videobuf2/videobuf2-dma-contig.c +0 -6
@@ -186,12 +186,6 @@ static int vb2_dc_mmap(void *buf_priv, struct vm_area_struct *vma)return -EINVAL ; } -/* -* dma_mmap_* uses vm_pgoff as in-buffer offset, but we want to -* map whole buffer -*/ - vma->vm_pgoff =0 ; - ret =dma_mmap_attrs (buf->dev, vma, buf->cookie, buf->dma_addr, buf->size, buf->attrs);
drivers/media/common/videobuf2/videobuf2-dma-sg.c +6 -16
@@ -328,28 +328,18 @@ static unsigned int vb2_dma_sg_num_users(void *buf_priv)static int vb2_dma_sg_mmap (void *buf_priv,struct vm_area_struct *vma) {struct vb2_dma_sg_buf *buf = buf_priv; -unsigned long uaddr = vma->vm_start; -unsigned long usize = vma->vm_end - vma->vm_start; -int i =0 ; +int err;if (!buf) {printk (KERN_ERR "No memory to map\n" );return -EINVAL ; } -do { -int ret; - - ret =vm_insert_page (vma, uaddr, buf->pages[i++]); -if (ret) { -printk (KERN_ERR "Remapping memory, error: %d\n" , ret); -return ret; - } - - uaddr +=PAGE_SIZE ; - usize -=PAGE_SIZE ; - }while (usize >0 ); - + err =vm_map_pages (vma, buf->pages, buf->num_pages); +if (err) { +printk (KERN_ERR "Remapping memory, error: %d\n" , err); +return err; + }/* * Use common vm_area operations to track buffer refcount.
Signature · 1 line
1.9.1