From: Hans Verkuil <hverkuil@xs4all.nl>
To: Junghak Sung <jh1009.sung@samsung.com>,
linux-media@vger.kernel.org, mchehab@osg.samsung.com,
laurent.pinchart@ideasonboard.com, sakari.ailus@iki.fi,
pawel@osciak.com
Cc: inki.dae@samsung.com, sw0312.kim@samsung.com,
nenggun.kim@samsung.com, sangbae90.lee@samsung.com,
rany.kwon@samsung.com
Subject: Re: [RFC PATCH v3 2/5] media: videobuf2: Restructure vb2_buffer
Date: Fri, 28 Aug 2015 15:31:13 +0200 [thread overview]
Message-ID: <55E062A1.2010900@xs4all.nl> (raw)
In-Reply-To: <1440590372-2377-3-git-send-email-jh1009.sung@samsung.com>
Hi Junghak,
Thanks for this patch, it looks much better. I do have a number of comments, though...
On 08/26/2015 01:59 PM, Junghak Sung wrote:
> Remove v4l2-specific stuff from struct vb2_buffer and add member variables
> related with buffer management.
>
> struct vb2_plane {
> <snip>
> /* plane information */
> unsigned int bytesused;
> unsigned int length;
> union {
> unsigned int offset;
> unsigned long userptr;
> int fd;
> } m;
> unsigned int data_offset;
> }
>
> struct vb2_buffer {
> <snip>
> /* buffer information */
> unsigned int num_planes;
> unsigned int index;
> unsigned int type;
> unsigned int memory;
>
> struct vb2_plane planes[VIDEO_MAX_PLANES];
> <snip>
> };
>
> And create struct vb2_v4l2_buffer as container buffer for v4l2 use.
>
> struct vb2_v4l2_buffer {
> struct vb2_buffer vb2_buf;
>
> __u32 flags;
> __u32 field;
> struct timeval timestamp;
> struct v4l2_timecode timecode;
> __u32 sequence;
> };
>
> This patch includes only changes inside of videobuf2. So, it is required to
> modify all device drivers which use videobuf2.
>
> Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
> Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
> Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
> Acked-by: Inki Dae <inki.dae@samsung.com>
> ---
> drivers/media/v4l2-core/videobuf2-core.c | 324 +++++++++++++++++-------------
> include/media/videobuf2-core.h | 50 ++---
> include/media/videobuf2-v4l2.h | 26 +++
> 3 files changed, 236 insertions(+), 164 deletions(-)
>
> diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c
> index ab00ea0..9266d50 100644
> --- a/drivers/media/v4l2-core/videobuf2-core.c
> +++ b/drivers/media/v4l2-core/videobuf2-core.c
> @@ -35,10 +35,10 @@
> static int debug;
> module_param(debug, int, 0644);
>
> -#define dprintk(level, fmt, arg...) \
> - do { \
> - if (debug >= level) \
> - pr_info("vb2: %s: " fmt, __func__, ## arg); \
> +#define dprintk(level, fmt, arg...) \
> + do { \
> + if (debug >= level) \
> + pr_info("vb2: %s: " fmt, __func__, ## arg); \
These are just whitespace changes, and that is something it see *a lot* in this
patch. And usually for no clear reason.
Please remove those whitespace changes, it makes a difficult patch even harder
to read than it already is.
> } while (0)
>
> #ifdef CONFIG_VIDEO_ADV_DEBUG
<snip>
> @@ -656,12 +652,21 @@ static bool __buffers_in_use(struct vb2_queue *q)
> */
> static void __fill_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b)
> {
> + struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
> struct vb2_queue *q = vb->vb2_queue;
> + unsigned int plane;
>
> /* Copy back data such as timestamp, flags, etc. */
> - memcpy(b, &vb->v4l2_buf, offsetof(struct v4l2_buffer, m));
> - b->reserved2 = vb->v4l2_buf.reserved2;
> - b->reserved = vb->v4l2_buf.reserved;
Hmm, I'm not sure why these reserved fields were copied here. I think it was
for compatibility reasons for some old drivers that abused the reserved field.
However, in the new code these reserved fields should probably be explicitly
initialized to 0.
> + b->index = vb->index;
> + b->type = vb->type;
> + b->memory = vb->memory;
> + b->bytesused = 0;
> +
> + b->flags = vbuf->flags;
> + b->field = vbuf->field;
> + b->timestamp = vbuf->timestamp;
> + b->timecode = vbuf->timecode;
> + b->sequence = vbuf->sequence;
>
> if (V4L2_TYPE_IS_MULTIPLANAR(q->type)) {
> /*
> @@ -669,21 +674,33 @@ static void __fill_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b)
> * for it. The caller has already verified memory and size.
> */
> b->length = vb->num_planes;
> - memcpy(b->m.planes, vb->v4l2_planes,
> - b->length * sizeof(struct v4l2_plane));
A similar problem occurs here: the memcpy would have copied the reserved
field in v4l2_plane as well, but that no longer happens, so you need to
do an explicit memset for the reserved field in the new code.
> + for (plane = 0; plane < vb->num_planes; ++plane) {
> + struct v4l2_plane *pdst = &b->m.planes[plane];
> + struct vb2_plane *psrc = &vb->planes[plane];
> +
> + pdst->bytesused = psrc->bytesused;
> + pdst->length = psrc->length;
> + if (q->memory == V4L2_MEMORY_MMAP)
> + pdst->m.mem_offset = psrc->m.offset;
> + else if (q->memory == V4L2_MEMORY_USERPTR)
> + pdst->m.userptr = psrc->m.userptr;
> + else if (q->memory == V4L2_MEMORY_DMABUF)
> + pdst->m.fd = psrc->m.fd;
> + pdst->data_offset = psrc->data_offset;
> + }
> } else {
> /*
> * We use length and offset in v4l2_planes array even for
> * single-planar buffers, but userspace does not.
> */
> - b->length = vb->v4l2_planes[0].length;
> - b->bytesused = vb->v4l2_planes[0].bytesused;
> + b->length = vb->planes[0].length;
> + b->bytesused = vb->planes[0].bytesused;
> if (q->memory == V4L2_MEMORY_MMAP)
> - b->m.offset = vb->v4l2_planes[0].m.mem_offset;
> + b->m.offset = vb->planes[0].m.offset;
> else if (q->memory == V4L2_MEMORY_USERPTR)
> - b->m.userptr = vb->v4l2_planes[0].m.userptr;
> + b->m.userptr = vb->planes[0].m.userptr;
> else if (q->memory == V4L2_MEMORY_DMABUF)
> - b->m.fd = vb->v4l2_planes[0].m.fd;
> + b->m.fd = vb->planes[0].m.fd;
> }
>
> /*
> @@ -692,7 +709,7 @@ static void __fill_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b)
> b->flags &= ~V4L2_BUFFER_MASK_FLAGS;
> b->flags |= q->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK;
> if ((q->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK) !=
> - V4L2_BUF_FLAG_TIMESTAMP_COPY) {
> + V4L2_BUF_FLAG_TIMESTAMP_COPY) {
> /*
> * For non-COPY timestamps, drop timestamp source bits
> * and obtain the timestamp source from the queue.
> @@ -767,7 +784,7 @@ EXPORT_SYMBOL(vb2_querybuf);
> static int __verify_userptr_ops(struct vb2_queue *q)
> {
> if (!(q->io_modes & VB2_USERPTR) || !q->mem_ops->get_userptr ||
> - !q->mem_ops->put_userptr)
> + !q->mem_ops->put_userptr)
> return -EINVAL;
>
> return 0;
> @@ -780,7 +797,7 @@ static int __verify_userptr_ops(struct vb2_queue *q)
> static int __verify_mmap_ops(struct vb2_queue *q)
> {
> if (!(q->io_modes & VB2_MMAP) || !q->mem_ops->alloc ||
> - !q->mem_ops->put || !q->mem_ops->mmap)
> + !q->mem_ops->put || !q->mem_ops->mmap)
> return -EINVAL;
>
> return 0;
> @@ -793,8 +810,8 @@ static int __verify_mmap_ops(struct vb2_queue *q)
> static int __verify_dmabuf_ops(struct vb2_queue *q)
> {
> if (!(q->io_modes & VB2_DMABUF) || !q->mem_ops->attach_dmabuf ||
> - !q->mem_ops->detach_dmabuf || !q->mem_ops->map_dmabuf ||
> - !q->mem_ops->unmap_dmabuf)
> + !q->mem_ops->detach_dmabuf || !q->mem_ops->map_dmabuf ||
> + !q->mem_ops->unmap_dmabuf)
> return -EINVAL;
>
> return 0;
> @@ -808,7 +825,7 @@ static int __verify_memory_type(struct vb2_queue *q,
> enum v4l2_memory memory, enum v4l2_buf_type type)
> {
> if (memory != V4L2_MEMORY_MMAP && memory != V4L2_MEMORY_USERPTR &&
> - memory != V4L2_MEMORY_DMABUF) {
> + memory != V4L2_MEMORY_DMABUF) {
> dprintk(1, "unsupported memory type\n");
> return -EINVAL;
> }
> @@ -927,7 +944,7 @@ static int __reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req)
> * Driver also sets the size and allocator context for each plane.
> */
> ret = call_qop(q, queue_setup, q, NULL, &num_buffers, &num_planes,
> - q->plane_sizes, q->alloc_ctx);
> + q->plane_sizes, q->alloc_ctx);
> if (ret)
> return ret;
>
> @@ -952,7 +969,7 @@ static int __reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req)
> num_buffers = allocated_buffers;
>
> ret = call_qop(q, queue_setup, q, NULL, &num_buffers,
> - &num_planes, q->plane_sizes, q->alloc_ctx);
> + &num_planes, q->plane_sizes, q->alloc_ctx);
>
> if (!ret && allocated_buffers < num_buffers)
> ret = -ENOMEM;
> @@ -1040,7 +1057,7 @@ static int __create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create
> * buffer and their sizes are acceptable
> */
> ret = call_qop(q, queue_setup, q, &create->format, &num_buffers,
> - &num_planes, q->plane_sizes, q->alloc_ctx);
> + &num_planes, q->plane_sizes, q->alloc_ctx);
> if (ret)
> return ret;
>
> @@ -1063,7 +1080,7 @@ static int __create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create
> * queue driver has set up
> */
> ret = call_qop(q, queue_setup, q, &create->format, &num_buffers,
> - &num_planes, q->plane_sizes, q->alloc_ctx);
> + &num_planes, q->plane_sizes, q->alloc_ctx);
>
> if (!ret && allocated_buffers < num_buffers)
> ret = -ENOMEM;
> @@ -1183,8 +1200,8 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
> return;
>
> if (WARN_ON(state != VB2_BUF_STATE_DONE &&
> - state != VB2_BUF_STATE_ERROR &&
> - state != VB2_BUF_STATE_QUEUED))
> + state != VB2_BUF_STATE_ERROR &&
> + state != VB2_BUF_STATE_QUEUED))
> state = VB2_BUF_STATE_ERROR;
>
> #ifdef CONFIG_VIDEO_ADV_DEBUG
All the chunks above are all spurious whitespace changes. As mentioned in the beginning,
please remove all those pointless whitespace changes!
There are a lot more of these, but I won't comment on them anymore.
Basically this patch looks good to me, so once I have the next version without all the
whitespace confusion and with the reserved field issues solved I'll do a final review.
BTW, did you test this with 'v4l2-compliance -s' and with the vivid driver? Just to
make sure you didn't break anything.
Regards,
Hans
next prev parent reply other threads:[~2015-08-28 13:32 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-26 11:59 [RFC PATCH v3 0/5] Refactoring Videobuf2 for common use Junghak Sung
2015-08-26 11:59 ` [RFC PATCH v3 1/5] media: videobuf2: Replace videobuf2-core with videobuf2-v4l2 Junghak Sung
2015-08-27 8:51 ` Mauro Carvalho Chehab
2015-08-26 11:59 ` [RFC PATCH v3 2/5] media: videobuf2: Restructure vb2_buffer Junghak Sung
2015-08-27 10:28 ` Mauro Carvalho Chehab
2015-08-28 1:26 ` Junghak Sung
2015-08-28 9:09 ` Mauro Carvalho Chehab
2015-08-28 13:31 ` Hans Verkuil [this message]
2015-08-31 2:01 ` Junghak Sung
2015-08-31 7:56 ` Junghak Sung
2015-08-31 8:24 ` Hans Verkuil
2015-08-26 11:59 ` [RFC PATCH v3 3/5] media: videobuf2: Modify all device drivers Junghak Sung
2015-08-27 10:33 ` Mauro Carvalho Chehab
2015-08-28 2:19 ` Junghak Sung
2015-08-28 9:14 ` Mauro Carvalho Chehab
2015-08-26 11:59 ` [RFC PATCH v3 4/5] media: videobuf2: Change queue_setup argument Junghak Sung
2015-08-27 10:45 ` Mauro Carvalho Chehab
2015-08-26 11:59 ` [RFC PATCH v3 5/5] media: videobuf2: Divide videobuf2-core into 2 parts Junghak Sung
2015-08-27 11:43 ` Mauro Carvalho Chehab
2015-08-28 6:50 ` Junghak Sung
2015-08-28 9:05 ` Mauro Carvalho Chehab
2015-08-28 13:50 ` Hans Verkuil
2015-08-31 2:08 ` Junghak Sung
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55E062A1.2010900@xs4all.nl \
--to=hverkuil@xs4all.nl \
--cc=inki.dae@samsung.com \
--cc=jh1009.sung@samsung.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@osg.samsung.com \
--cc=nenggun.kim@samsung.com \
--cc=pawel@osciak.com \
--cc=rany.kwon@samsung.com \
--cc=sakari.ailus@iki.fi \
--cc=sangbae90.lee@samsung.com \
--cc=sw0312.kim@samsung.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.