V4L/DVB (6266): videobuf cleanup: mmap check is common to all videobuf. Make it at...
authorMauro Carvalho Chehab <mchehab@infradead.org>
Thu, 27 Sep 2007 21:25:44 +0000 (18:25 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Wed, 10 Oct 2007 03:02:55 +0000 (00:02 -0300)
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
http://thread.gmane.org/gmane.comp.video.video4linux/34978/focus=34981
Reviewed-by: Ricardo Cerqueira <v4l@cerqueira.org>
drivers/media/video/videobuf-core.c
drivers/media/video/videobuf-dma-sg.c
drivers/media/video/videobuf-vmalloc.c
include/media/videobuf-core.h
include/media/videobuf-dma-sg.h
include/media/videobuf-vmalloc.h

index eb3b98400c1b6c802a292a0deb61e54d678862c4..3bd06bb633a717ecdb39b28a0a7f2569c3f1c2d5 100644 (file)
@@ -149,7 +149,7 @@ int videobuf_queue_is_busy(struct videobuf_queue *q)
        for (i = 0; i < VIDEO_MAX_FRAME; i++) {
                if (NULL == q->bufs[i])
                        continue;
-               if (CALL(q,is_mmapped,q->bufs[i])) {
+               if (q->bufs[i]->map) {
                        dprintk(1,"busy: buffer #%d mapped\n",i);
                        return 1;
                }
@@ -238,7 +238,7 @@ static void videobuf_status(struct videobuf_queue *q, struct v4l2_buffer *b,
        }
 
        b->flags    = 0;
-       if (CALL(q,is_mmapped,vb))
+       if (vb->map)
                b->flags |= V4L2_BUF_FLAG_MAPPED;
 
        switch (vb->state) {
index 3345877c47d4b75c17bce92d21ac7b0e649b803c..0939ede831ab3fac8c36e3e746abbec27e12f450 100644 (file)
@@ -374,9 +374,9 @@ videobuf_vm_close(struct vm_area_struct *vma)
 
                        MAGIC_CHECK(mem->magic,MAGIC_SG_MEM);
 
-                       if (mem->map != map)
+                       if (q->bufs[i]->map != map)
                                continue;
-                       mem->map   = NULL;
+                       q->bufs[i]->map   = NULL;
                        q->bufs[i]->baddr = 0;
                        q->ops->buf_release(q,q->bufs[i]);
                }
@@ -520,8 +520,7 @@ static int __videobuf_mmap_free(struct videobuf_queue *q)
 
        for (i = 0; i < VIDEO_MAX_FRAME; i++) {
                if (q->bufs[i]) {
-                       struct videbuf_pci_sg_memory *mem=q->bufs[i]->priv;
-                       if (mem && mem->map)
+                       if (q->bufs[i]->map)
                                return -EBUSY;
                }
        }
@@ -572,8 +571,7 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q,
                        continue;
                if (V4L2_MEMORY_MMAP != q->bufs[last]->memory)
                        continue;
-               mem=q->bufs[last]->priv;
-               if (mem->map) {
+               if (q->bufs[last]->map) {
                        retval = -EBUSY;
                        goto done;
                }
@@ -593,8 +591,7 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q,
        if (NULL == map)
                goto done;
        for (size = 0, i = first; i <= last; size += q->bufs[i++]->bsize) {
-               mem=q->bufs[i]->priv;
-               mem->map   = map;
+               q->bufs[i]->map   = map;
                q->bufs[i]->baddr = vma->vm_start + size;
        }
        map->count    = 1;
@@ -613,16 +610,6 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q,
        return retval;
 }
 
-static int __videobuf_is_mmapped (struct videobuf_buffer *buf)
-{
-       struct videbuf_pci_sg_memory *mem=buf->priv;
-
-       BUG_ON (!mem);
-       MAGIC_CHECK(mem->magic,MAGIC_SG_MEM);
-
-       return (mem->map)?1:0;
-}
-
 static int __videobuf_copy_to_user ( struct videobuf_queue *q,
                                char __user *data, size_t count,
                                int nonblocking )
@@ -678,7 +665,6 @@ static struct videobuf_qtype_ops pci_ops = {
        .sync         = __videobuf_sync,
        .mmap_free    = __videobuf_mmap_free,
        .mmap_mapper  = __videobuf_mmap_mapper,
-       .is_mmapped   = __videobuf_is_mmapped,
        .copy_to_user = __videobuf_copy_to_user,
        .copy_stream  = __videobuf_copy_stream,
 };
index fd059cde63f4d882c58ec6556a7da4cf8584683a..c9d6ae0d3b49635659b100143c616157b0031ead 100644 (file)
@@ -62,7 +62,6 @@ videobuf_vm_close(struct vm_area_struct *vma)
 {
        struct videobuf_mapping *map = vma->vm_private_data;
        struct videobuf_queue *q = map->q;
-       struct videbuf_vmalloc_memory *mem;
        int i;
 
        dprintk(2,"vm_close %p [count=%d,vma=%08lx-%08lx]\n",map,
@@ -75,19 +74,13 @@ videobuf_vm_close(struct vm_area_struct *vma)
                for (i = 0; i < VIDEO_MAX_FRAME; i++) {
                        if (NULL == q->bufs[i])
                                continue;
-                       mem=q->bufs[i]->priv;
 
-                       if (!mem)
-                               continue;
-
-                       MAGIC_CHECK(mem->magic,MAGIC_VMAL_MEM);
-
-                       if (mem->map != map)
+                       if (q->bufs[i]->map != map)
                                continue;
 
                        q->ops->buf_release(q,q->bufs[i]);
 
-                       mem->map   = NULL;
+                       q->bufs[i]->map   = NULL;
                        q->bufs[i]->baddr = 0;
                }
                mutex_unlock(&q->lock);
@@ -191,8 +184,7 @@ static int __videobuf_mmap_free(struct videobuf_queue *q)
 
        for (i = 0; i < VIDEO_MAX_FRAME; i++) {
                if (q->bufs[i]) {
-                       struct videbuf_vmalloc_memory *mem=q->bufs[i]->priv;
-                       if (mem && mem->map)
+                       if (q->bufs[i]->map)
                                return -EBUSY;
                }
        }
@@ -227,12 +219,9 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q,
                        (vma->vm_pgoff << PAGE_SHIFT));
                return -EINVAL;
        }
-       mem=q->bufs[first]->priv;
-       BUG_ON (!mem);
-       MAGIC_CHECK(mem->magic,MAGIC_VMAL_MEM);
 
        /* create mapping + update buffer list */
-       map = mem->map = kmalloc(sizeof(struct videobuf_mapping),GFP_KERNEL);
+       map = q->bufs[first]->map = kmalloc(sizeof(struct videobuf_mapping),GFP_KERNEL);
        if (NULL == map)
                return -ENOMEM;
 
@@ -246,14 +235,19 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q,
        vma->vm_flags       |= VM_DONTEXPAND | VM_RESERVED;
        vma->vm_private_data = map;
 
+       mem=q->bufs[first]->priv;
+       BUG_ON (!mem);
+       MAGIC_CHECK(mem->magic,MAGIC_VMAL_MEM);
+
        /* Try to remap memory */
        retval=remap_vmalloc_range(vma, mem->vmalloc,0);
        if (retval<0) {
                dprintk(1,"mmap: postponing remap_vmalloc_range\n");
+
                mem->vma=kmalloc(sizeof(*vma),GFP_KERNEL);
                if (!mem->vma) {
                        kfree(map);
-                       mem->map=NULL;
+                       q->bufs[first]->map=NULL;
                        return -ENOMEM;
                }
                memcpy(mem->vma,vma,sizeof(*vma));
@@ -269,15 +263,6 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q,
        return (0);
 }
 
-static int __videobuf_is_mmapped (struct videobuf_buffer *buf)
-{
-       struct videbuf_vmalloc_memory *mem=buf->priv;
-       BUG_ON (!mem);
-       MAGIC_CHECK(mem->magic,MAGIC_VMAL_MEM);
-
-       return (mem->map)?1:0;
-}
-
 static int __videobuf_copy_to_user ( struct videobuf_queue *q,
                                char __user *data, size_t count,
                                int nonblocking )
@@ -335,7 +320,6 @@ static struct videobuf_qtype_ops qops = {
        .sync         = __videobuf_sync,
        .mmap_free    = __videobuf_mmap_free,
        .mmap_mapper  = __videobuf_mmap_mapper,
-       .is_mmapped   = __videobuf_is_mmapped,
        .copy_to_user = __videobuf_copy_to_user,
        .copy_stream  = __videobuf_copy_stream,
 };
index 0ac21ae44f69cd9f609a63386c82d0d6e8de6964..96949e31eaf8bff2c5e256234c955bfa64a6925d 100644 (file)
@@ -97,6 +97,9 @@ struct videobuf_buffer {
        /* buffer addr (userland ptr!) */
        unsigned long           baddr;
 
+       /* for mmap'ed buffers */
+       struct videobuf_mapping *map;
+
        /* Private pointer to allow specific methods to store their data */
        int                     privsize;
        void                    *priv;
@@ -143,7 +146,6 @@ struct videobuf_qtype_ops {
        int (*mmap_free)        (struct videobuf_queue *q);
        int (*mmap_mapper)      (struct videobuf_queue *q,
                                struct vm_area_struct *vma);
-       int (*is_mmapped)       (struct videobuf_buffer *buf);
 };
 
 struct videobuf_queue {
index 62a3709905f341798a04691e28123610157d7318..206d9027b39f52c94d3100ef2ccd6f922b85dcad 100644 (file)
@@ -86,7 +86,6 @@ struct videbuf_pci_sg_memory
        u32                 magic;
 
        /* for mmap'ed buffers */
-       struct videobuf_mapping *map;
        struct videobuf_dmabuf  dma;
 };
 
index 5fff68df66896ae963303e4718a558712dfa6dc2..26a8958d23d16d64ab1739b7b7ecb0765c4a5e76 100644 (file)
@@ -21,9 +21,6 @@ struct videbuf_vmalloc_memory
 {
        u32                 magic;
 
-       /* for mmap'ed buffers */
-       struct videobuf_mapping *map;
-
        void                *vmalloc;
 
        /* remap_vmalloc_range seems to need to run after mmap() on some cases */