|
@@ -62,7 +62,6 @@ videobuf_vm_close(struct vm_area_struct *vma)
|
|
{
|
|
{
|
|
struct videobuf_mapping *map = vma->vm_private_data;
|
|
struct videobuf_mapping *map = vma->vm_private_data;
|
|
struct videobuf_queue *q = map->q;
|
|
struct videobuf_queue *q = map->q;
|
|
- struct videbuf_vmalloc_memory *mem;
|
|
|
|
int i;
|
|
int i;
|
|
|
|
|
|
dprintk(2,"vm_close %p [count=%d,vma=%08lx-%08lx]\n",map,
|
|
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++) {
|
|
for (i = 0; i < VIDEO_MAX_FRAME; i++) {
|
|
if (NULL == q->bufs[i])
|
|
if (NULL == q->bufs[i])
|
|
continue;
|
|
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;
|
|
continue;
|
|
|
|
|
|
q->ops->buf_release(q,q->bufs[i]);
|
|
q->ops->buf_release(q,q->bufs[i]);
|
|
|
|
|
|
- mem->map = NULL;
|
|
|
|
|
|
+ q->bufs[i]->map = NULL;
|
|
q->bufs[i]->baddr = 0;
|
|
q->bufs[i]->baddr = 0;
|
|
}
|
|
}
|
|
mutex_unlock(&q->lock);
|
|
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++) {
|
|
for (i = 0; i < VIDEO_MAX_FRAME; i++) {
|
|
if (q->bufs[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;
|
|
return -EBUSY;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -227,12 +219,9 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q,
|
|
(vma->vm_pgoff << PAGE_SHIFT));
|
|
(vma->vm_pgoff << PAGE_SHIFT));
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
- mem=q->bufs[first]->priv;
|
|
|
|
- BUG_ON (!mem);
|
|
|
|
- MAGIC_CHECK(mem->magic,MAGIC_VMAL_MEM);
|
|
|
|
|
|
|
|
/* create mapping + update buffer list */
|
|
/* 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)
|
|
if (NULL == map)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
@@ -246,14 +235,19 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q,
|
|
vma->vm_flags |= VM_DONTEXPAND | VM_RESERVED;
|
|
vma->vm_flags |= VM_DONTEXPAND | VM_RESERVED;
|
|
vma->vm_private_data = map;
|
|
vma->vm_private_data = map;
|
|
|
|
|
|
|
|
+ mem=q->bufs[first]->priv;
|
|
|
|
+ BUG_ON (!mem);
|
|
|
|
+ MAGIC_CHECK(mem->magic,MAGIC_VMAL_MEM);
|
|
|
|
+
|
|
/* Try to remap memory */
|
|
/* Try to remap memory */
|
|
retval=remap_vmalloc_range(vma, mem->vmalloc,0);
|
|
retval=remap_vmalloc_range(vma, mem->vmalloc,0);
|
|
if (retval<0) {
|
|
if (retval<0) {
|
|
dprintk(1,"mmap: postponing remap_vmalloc_range\n");
|
|
dprintk(1,"mmap: postponing remap_vmalloc_range\n");
|
|
|
|
+
|
|
mem->vma=kmalloc(sizeof(*vma),GFP_KERNEL);
|
|
mem->vma=kmalloc(sizeof(*vma),GFP_KERNEL);
|
|
if (!mem->vma) {
|
|
if (!mem->vma) {
|
|
kfree(map);
|
|
kfree(map);
|
|
- mem->map=NULL;
|
|
|
|
|
|
+ q->bufs[first]->map=NULL;
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
}
|
|
}
|
|
memcpy(mem->vma,vma,sizeof(*vma));
|
|
memcpy(mem->vma,vma,sizeof(*vma));
|
|
@@ -269,15 +263,6 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q,
|
|
return (0);
|
|
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,
|
|
static int __videobuf_copy_to_user ( struct videobuf_queue *q,
|
|
char __user *data, size_t count,
|
|
char __user *data, size_t count,
|
|
int nonblocking )
|
|
int nonblocking )
|
|
@@ -335,7 +320,6 @@ static struct videobuf_qtype_ops qops = {
|
|
.sync = __videobuf_sync,
|
|
.sync = __videobuf_sync,
|
|
.mmap_free = __videobuf_mmap_free,
|
|
.mmap_free = __videobuf_mmap_free,
|
|
.mmap_mapper = __videobuf_mmap_mapper,
|
|
.mmap_mapper = __videobuf_mmap_mapper,
|
|
- .is_mmapped = __videobuf_is_mmapped,
|
|
|
|
.copy_to_user = __videobuf_copy_to_user,
|
|
.copy_to_user = __videobuf_copy_to_user,
|
|
.copy_stream = __videobuf_copy_stream,
|
|
.copy_stream = __videobuf_copy_stream,
|
|
};
|
|
};
|