Commit 7cbefad0 authored by Tuukka Toivonen's avatar Tuukka Toivonen Committed by Mauro Carvalho Chehab

V4L/DVB (13165): videobuf do not force buffer size to be multiple of PAGE_SIZE

When the image size (bytesperline*height) is not multiple
of PAGE_SIZE, v4l2 rounded the required buffer size to
be multiple of PAGE_SIZE. This prevented user space
to store images directly into userptr buffers which were
not multiple of PAGE_SIZE. This constraint is removed.

The start address is still assumed to be required
page-aligned, ie., when v4l2 allocates mmap buffers,
the offset between different buffers is page-aligned.
Signed-off-by: default avatarTuukka Toivonen <tuukka.o.toivonen@nokia.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 131db3a1
...@@ -360,7 +360,7 @@ int __videobuf_mmap_setup(struct videobuf_queue *q, ...@@ -360,7 +360,7 @@ int __videobuf_mmap_setup(struct videobuf_queue *q,
q->bufs[i]->bsize = bsize; q->bufs[i]->bsize = bsize;
switch (memory) { switch (memory) {
case V4L2_MEMORY_MMAP: case V4L2_MEMORY_MMAP:
q->bufs[i]->boff = bsize * i; q->bufs[i]->boff = PAGE_ALIGN(bsize) * i;
break; break;
case V4L2_MEMORY_USERPTR: case V4L2_MEMORY_USERPTR:
case V4L2_MEMORY_OVERLAY: case V4L2_MEMORY_OVERLAY:
...@@ -430,9 +430,8 @@ int videobuf_reqbufs(struct videobuf_queue *q, ...@@ -430,9 +430,8 @@ int videobuf_reqbufs(struct videobuf_queue *q,
count = VIDEO_MAX_FRAME; count = VIDEO_MAX_FRAME;
size = 0; size = 0;
q->ops->buf_setup(q, &count, &size); q->ops->buf_setup(q, &count, &size);
size = PAGE_ALIGN(size);
dprintk(1, "reqbufs: bufs=%d, size=0x%x [%d pages total]\n", dprintk(1, "reqbufs: bufs=%d, size=0x%x [%d pages total]\n",
count, size, (count*size)>>PAGE_SHIFT); count, size, (count*PAGE_ALIGN(size))>>PAGE_SHIFT);
retval = __videobuf_mmap_setup(q, count, size, req->memory); retval = __videobuf_mmap_setup(q, count, size, req->memory);
if (retval < 0) { if (retval < 0) {
...@@ -1099,7 +1098,7 @@ int videobuf_cgmbuf(struct videobuf_queue *q, ...@@ -1099,7 +1098,7 @@ int videobuf_cgmbuf(struct videobuf_queue *q,
mbuf->size = 0; mbuf->size = 0;
for (i = 0; i < mbuf->frames; i++) { for (i = 0; i < mbuf->frames; i++) {
mbuf->offsets[i] = q->bufs[i]->boff; mbuf->offsets[i] = q->bufs[i]->boff;
mbuf->size += q->bufs[i]->bsize; mbuf->size += PAGE_ALIGN(q->bufs[i]->bsize);
} }
return 0; return 0;
......
...@@ -588,7 +588,7 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q, ...@@ -588,7 +588,7 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q,
retval = -EBUSY; retval = -EBUSY;
goto done; goto done;
} }
size += q->bufs[last]->bsize; size += PAGE_ALIGN(q->bufs[last]->bsize);
if (size == (vma->vm_end - vma->vm_start)) if (size == (vma->vm_end - vma->vm_start))
break; break;
} }
...@@ -610,7 +610,7 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q, ...@@ -610,7 +610,7 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q,
continue; continue;
q->bufs[i]->map = map; q->bufs[i]->map = map;
q->bufs[i]->baddr = vma->vm_start + size; q->bufs[i]->baddr = vma->vm_start + size;
size += q->bufs[i]->bsize; size += PAGE_ALIGN(q->bufs[i]->bsize);
} }
map->count = 1; map->count = 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment