diff options
Diffstat (limited to 'drivers/media/video/videobuf-vmalloc.c')
-rw-r--r-- | drivers/media/video/videobuf-vmalloc.c | 36 |
1 files changed, 10 insertions, 26 deletions
diff --git a/drivers/media/video/videobuf-vmalloc.c b/drivers/media/video/videobuf-vmalloc.c index fd059cde63f4..c9d6ae0d3b49 100644 --- a/drivers/media/video/videobuf-vmalloc.c +++ b/drivers/media/video/videobuf-vmalloc.c | |||
@@ -62,7 +62,6 @@ videobuf_vm_close(struct vm_area_struct *vma) | |||
62 | { | 62 | { |
63 | struct videobuf_mapping *map = vma->vm_private_data; | 63 | struct videobuf_mapping *map = vma->vm_private_data; |
64 | struct videobuf_queue *q = map->q; | 64 | struct videobuf_queue *q = map->q; |
65 | struct videbuf_vmalloc_memory *mem; | ||
66 | int i; | 65 | int i; |
67 | 66 | ||
68 | dprintk(2,"vm_close %p [count=%d,vma=%08lx-%08lx]\n",map, | 67 | dprintk(2,"vm_close %p [count=%d,vma=%08lx-%08lx]\n",map, |
@@ -75,19 +74,13 @@ videobuf_vm_close(struct vm_area_struct *vma) | |||
75 | for (i = 0; i < VIDEO_MAX_FRAME; i++) { | 74 | for (i = 0; i < VIDEO_MAX_FRAME; i++) { |
76 | if (NULL == q->bufs[i]) | 75 | if (NULL == q->bufs[i]) |
77 | continue; | 76 | continue; |
78 | mem=q->bufs[i]->priv; | ||
79 | 77 | ||
80 | if (!mem) | 78 | if (q->bufs[i]->map != map) |
81 | continue; | ||
82 | |||
83 | MAGIC_CHECK(mem->magic,MAGIC_VMAL_MEM); | ||
84 | |||
85 | if (mem->map != map) | ||
86 | continue; | 79 | continue; |
87 | 80 | ||
88 | q->ops->buf_release(q,q->bufs[i]); | 81 | q->ops->buf_release(q,q->bufs[i]); |
89 | 82 | ||
90 | mem->map = NULL; | 83 | q->bufs[i]->map = NULL; |
91 | q->bufs[i]->baddr = 0; | 84 | q->bufs[i]->baddr = 0; |
92 | } | 85 | } |
93 | mutex_unlock(&q->lock); | 86 | mutex_unlock(&q->lock); |
@@ -191,8 +184,7 @@ static int __videobuf_mmap_free(struct videobuf_queue *q) | |||
191 | 184 | ||
192 | for (i = 0; i < VIDEO_MAX_FRAME; i++) { | 185 | for (i = 0; i < VIDEO_MAX_FRAME; i++) { |
193 | if (q->bufs[i]) { | 186 | if (q->bufs[i]) { |
194 | struct videbuf_vmalloc_memory *mem=q->bufs[i]->priv; | 187 | if (q->bufs[i]->map) |
195 | if (mem && mem->map) | ||
196 | return -EBUSY; | 188 | return -EBUSY; |
197 | } | 189 | } |
198 | } | 190 | } |
@@ -227,12 +219,9 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q, | |||
227 | (vma->vm_pgoff << PAGE_SHIFT)); | 219 | (vma->vm_pgoff << PAGE_SHIFT)); |
228 | return -EINVAL; | 220 | return -EINVAL; |
229 | } | 221 | } |
230 | mem=q->bufs[first]->priv; | ||
231 | BUG_ON (!mem); | ||
232 | MAGIC_CHECK(mem->magic,MAGIC_VMAL_MEM); | ||
233 | 222 | ||
234 | /* create mapping + update buffer list */ | 223 | /* create mapping + update buffer list */ |
235 | map = mem->map = kmalloc(sizeof(struct videobuf_mapping),GFP_KERNEL); | 224 | map = q->bufs[first]->map = kmalloc(sizeof(struct videobuf_mapping),GFP_KERNEL); |
236 | if (NULL == map) | 225 | if (NULL == map) |
237 | return -ENOMEM; | 226 | return -ENOMEM; |
238 | 227 | ||
@@ -246,14 +235,19 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q, | |||
246 | vma->vm_flags |= VM_DONTEXPAND | VM_RESERVED; | 235 | vma->vm_flags |= VM_DONTEXPAND | VM_RESERVED; |
247 | vma->vm_private_data = map; | 236 | vma->vm_private_data = map; |
248 | 237 | ||
238 | mem=q->bufs[first]->priv; | ||
239 | BUG_ON (!mem); | ||
240 | MAGIC_CHECK(mem->magic,MAGIC_VMAL_MEM); | ||
241 | |||
249 | /* Try to remap memory */ | 242 | /* Try to remap memory */ |
250 | retval=remap_vmalloc_range(vma, mem->vmalloc,0); | 243 | retval=remap_vmalloc_range(vma, mem->vmalloc,0); |
251 | if (retval<0) { | 244 | if (retval<0) { |
252 | dprintk(1,"mmap: postponing remap_vmalloc_range\n"); | 245 | dprintk(1,"mmap: postponing remap_vmalloc_range\n"); |
246 | |||
253 | mem->vma=kmalloc(sizeof(*vma),GFP_KERNEL); | 247 | mem->vma=kmalloc(sizeof(*vma),GFP_KERNEL); |
254 | if (!mem->vma) { | 248 | if (!mem->vma) { |
255 | kfree(map); | 249 | kfree(map); |
256 | mem->map=NULL; | 250 | q->bufs[first]->map=NULL; |
257 | return -ENOMEM; | 251 | return -ENOMEM; |
258 | } | 252 | } |
259 | memcpy(mem->vma,vma,sizeof(*vma)); | 253 | memcpy(mem->vma,vma,sizeof(*vma)); |
@@ -269,15 +263,6 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q, | |||
269 | return (0); | 263 | return (0); |
270 | } | 264 | } |
271 | 265 | ||
272 | static int __videobuf_is_mmapped (struct videobuf_buffer *buf) | ||
273 | { | ||
274 | struct videbuf_vmalloc_memory *mem=buf->priv; | ||
275 | BUG_ON (!mem); | ||
276 | MAGIC_CHECK(mem->magic,MAGIC_VMAL_MEM); | ||
277 | |||
278 | return (mem->map)?1:0; | ||
279 | } | ||
280 | |||
281 | static int __videobuf_copy_to_user ( struct videobuf_queue *q, | 266 | static int __videobuf_copy_to_user ( struct videobuf_queue *q, |
282 | char __user *data, size_t count, | 267 | char __user *data, size_t count, |
283 | int nonblocking ) | 268 | int nonblocking ) |
@@ -335,7 +320,6 @@ static struct videobuf_qtype_ops qops = { | |||
335 | .sync = __videobuf_sync, | 320 | .sync = __videobuf_sync, |
336 | .mmap_free = __videobuf_mmap_free, | 321 | .mmap_free = __videobuf_mmap_free, |
337 | .mmap_mapper = __videobuf_mmap_mapper, | 322 | .mmap_mapper = __videobuf_mmap_mapper, |
338 | .is_mmapped = __videobuf_is_mmapped, | ||
339 | .copy_to_user = __videobuf_copy_to_user, | 323 | .copy_to_user = __videobuf_copy_to_user, |
340 | .copy_stream = __videobuf_copy_stream, | 324 | .copy_stream = __videobuf_copy_stream, |
341 | }; | 325 | }; |