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