RE: [PATCH 3/7] v4l: videobuf2: add vmalloc allocator

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

 



Hello,

On Monday, November 29, 2010 10:51 AM Laurent Pinchart wrote:

> Hi Marek,
> 
> On Friday 19 November 2010 16:55:40 Marek Szyprowski wrote:
> > From: Pawel Osciak <p.osciak@xxxxxxxxxxx>
> >
> > Add an implementation of contiguous virtual memory allocator and handling
> > routines for videobuf2, implemented on top of vmalloc()/vfree() calls.
> >
> > Signed-off-by: Pawel Osciak <p.osciak@xxxxxxxxxxx>
> > Signed-off-by: Kyungmin Park <kyungmin.park@xxxxxxxxxxx>
> > Signed-off-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx>
> > CC: Pawel Osciak <pawel@xxxxxxxxxx>
> > ---
> >  drivers/media/video/Kconfig             |    5 +
> >  drivers/media/video/Makefile            |    1 +
> >  drivers/media/video/videobuf2-vmalloc.c |  177
> > +++++++++++++++++++++++++++++++ include/media/videobuf2-vmalloc.h       |
> >  21 ++++
> >  4 files changed, 204 insertions(+), 0 deletions(-)
> >  create mode 100644 drivers/media/video/videobuf2-vmalloc.c
> >  create mode 100644 include/media/videobuf2-vmalloc.h
> >
> > diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
> > index 83ce858..9351423 100644
> > --- a/drivers/media/video/Kconfig
> > +++ b/drivers/media/video/Kconfig
> > @@ -55,6 +55,11 @@ config VIDEOBUF2_CORE
> >  config VIDEOBUF2_MEMOPS
> >  	tristate
> >
> > +config VIDEOBUF2_VMALLOC
> > +	select VIDEOBUF2_CORE
> > +	select VIDEOBUF2_MEMOPS
> > +	tristate
> > +
> >  #
> >  # Multimedia Video device configuration
> >  #
> > diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile
> > index a97a2a0..538bee9 100644
> > --- a/drivers/media/video/Makefile
> > +++ b/drivers/media/video/Makefile
> > @@ -116,6 +116,7 @@ obj-$(CONFIG_VIDEO_BTCX)  += btcx-risc.o
> >
> >  obj-$(CONFIG_VIDEOBUF2_CORE)		+= videobuf2-core.o
> >  obj-$(CONFIG_VIDEOBUF2_MEMOPS)		+= videobuf2-memops.o
> > +obj-$(CONFIG_VIDEOBUF2_VMALLOC)		+= videobuf2-vmalloc.o
> >
> >  obj-$(CONFIG_V4L2_MEM2MEM_DEV) += v4l2-mem2mem.o
> >
> > diff --git a/drivers/media/video/videobuf2-vmalloc.c
> > b/drivers/media/video/videobuf2-vmalloc.c new file mode 100644
> > index 0000000..3310900
> > --- /dev/null
> > +++ b/drivers/media/video/videobuf2-vmalloc.c
> > @@ -0,0 +1,177 @@
> > +/*
> > + * videobuf2-vmalloc.c - vmalloc memory allocator for videobuf2
> > + *
> > + * Copyright (C) 2010 Samsung Electronics
> > + *
> > + * Author: Pawel Osciak <p.osciak@xxxxxxxxxxx>
> > + *
> > + * This program is free software; you can redistribute it and/or modify
> > + * it under the terms of the GNU General Public License as published by
> > + * the Free Software Foundation.
> > + */
> > +
> > +#include <linux/module.h>
> > +#include <linux/mm.h>
> > +#include <linux/slab.h>
> > +#include <linux/vmalloc.h>
> > +
> > +#include <media/videobuf2-core.h>
> > +#include <media/videobuf2-memops.h>
> > +
> > +struct vb2_vmalloc_conf {
> > +	struct vb2_alloc_ctx	alloc_ctx;
> > +};
> > +
> > +struct vb2_vmalloc_buf {
> > +	void			*vaddr;
> > +	unsigned long		size;
> > +	unsigned int		refcount;
> > +};
> > +
> > +static void *vb2_vmalloc_alloc(const struct vb2_alloc_ctx *alloc_ctx,
> > +				unsigned long size)
> > +{
> > +	struct vb2_vmalloc_buf *buf;
> > +
> > +	buf = kzalloc(sizeof *buf, GFP_KERNEL);
> > +	if (!buf)
> > +		return NULL;
> > +
> > +	buf->size = size;
> > +	buf->vaddr = vmalloc_user(buf->size);
> 
> Some drivers might need vmalloc_32_user instead.

Which driver might require this? I'm quite surprised. I thought that vmalloced
memory buffers are used only by the drivers that need to copy video data with CPU
anyway.

<snip>

> > +static int vb2_vmalloc_mmap(void *buf_priv, struct vm_area_struct *vma)
> > +{
> > +	struct vb2_vmalloc_buf *buf = buf_priv;
> > +	int ret;
> > +
> > +	if (!buf) {
> > +		printk(KERN_ERR "No memory to map\n");
> > +		return -EINVAL;
> > +	}
> 
> I think you should test that the VMA size is equal to (or smaller than) the
> buffer size. That could be done in the core.

Right.

> > +	ret = remap_vmalloc_range(vma, buf->vaddr, 0);
> > +	if (ret) {
> > +		printk(KERN_ERR "Remapping vmalloc memory, error: %d\n", ret);
> > +		return ret;
> > +	}
> > +
> > +	vma->vm_flags		|= VM_DONTEXPAND | VM_RESERVED;
> 
> VM_RESERVED is set by remap_vmalloc_range(). What is VM_DONTEXPAND for ?

It is used to prevent merging vm_areas for 2 consecutive buffers, because
otherwise one might cause a lot of troubles by calling mremap() function from
userspace with size larger than the size of the single buffer.

<snip>

Best regards
--
Marek Szyprowski
Samsung Poland R&D Center

--
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