From: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
To: Alexandre Courbot <acourbot@chromium.org>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Hans Verkuil <hverkuil@xs4all.nl>,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Pawel Osciak <posciak@chromium.org>,
Marek Szyprowski <m.szyprowski@samsung.com>,
Tomasz Figa <tfiga@chromium.org>,
Sakari Ailus <sakari.ailus@linux.intel.com>
Cc: Gustavo Padovan <gustavo.padovan@collabora.com>,
linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
Maxime Ripard <maxime.ripard@bootlin.com>
Subject: Re: [RFCv4,13/21] media: videobuf2-v4l2: support for requests
Date: Wed, 07 Mar 2018 17:50:24 +0100 [thread overview]
Message-ID: <1520441424.1092.25.camel@bootlin.com> (raw)
In-Reply-To: <20180220044425.169493-14-acourbot@chromium.org>
[-- Attachment #1: Type: text/plain, Size: 4128 bytes --]
Hi,
On Tue, 2018-02-20 at 13:44 +0900, Alexandre Courbot wrote:
> Add a new vb2_qbuf_request() (a request-aware version of vb2_qbuf())
> that request-aware drivers can call to queue a buffer into a request
> instead of directly into the vb2 queue if relevent.
>
> This function expects that drivers invoking it are using instances of
> v4l2_request_entity and v4l2_request_entity_data to describe their
> entity and entity data respectively.
>
> Also add the vb2_request_submit() helper function which drivers can
> invoke in order to queue all the buffers previously queued into a
> request into the regular vb2 queue.
See a comment/proposal below about an issue I encountered when using
multi-planar formats.
> Signed-off-by: Alexandre Courbot <acourbot@chromium.org>
> ---
> .../media/common/videobuf2/videobuf2-v4l2.c | 129
> +++++++++++++++++-
> include/media/videobuf2-v4l2.h | 59 ++++++++
> 2 files changed, 187 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c
> b/drivers/media/common/videobuf2/videobuf2-v4l2.c
> index 6d4d184aa68e..0627c3339572 100644
> --- a/drivers/media/common/videobuf2/videobuf2-v4l2.c
> +++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c
[...]
> +#if IS_ENABLED(CONFIG_MEDIA_REQUEST_API)
> +int vb2_qbuf_request(struct vb2_queue *q, struct v4l2_buffer *b,
> + struct media_request_entity *entity)
> +{
> + struct v4l2_request_entity_data *data;
> + struct v4l2_vb2_request_buffer *qb;
> + struct media_request *req;
> + struct vb2_buffer *vb;
> + int ret = 0;
> +
> + if (b->request_fd <= 0)
> + return vb2_qbuf(q, b);
> +
> + if (!q->allow_requests)
> + return -EINVAL;
> +
> + req = media_request_get_from_fd(b->request_fd);
> + if (!req)
> + return -EINVAL;
> +
> + data = to_v4l2_entity_data(media_request_get_entity_data(req,
> entity));
> + if (IS_ERR(data)) {
> + ret = PTR_ERR(data);
> + goto out;
> + }
> +
> + mutex_lock(&req->lock);
> +
> + if (req->state != MEDIA_REQUEST_STATE_IDLE) {
> + ret = -EINVAL;
> + goto out;
> + }
> +
> + ret = vb2_queue_or_prepare_buf(q, b, "qbuf");
> + if (ret)
> + goto out;
> +
> + vb = q->bufs[b->index];
> + switch (vb->state) {
> + case VB2_BUF_STATE_DEQUEUED:
> + break;
> + case VB2_BUF_STATE_PREPARED:
> + break;
> + case VB2_BUF_STATE_PREPARING:
> + dprintk(1, "buffer still being prepared\n");
> + ret = -EINVAL;
> + goto out;
> + default:
> + dprintk(1, "invalid buffer state %d\n", vb->state);
> + ret = -EINVAL;
> + goto out;
> + }
> +
> + /* do we already have a buffer for this request in the queue?
> */
> + list_for_each_entry(qb, &data->queued_buffers, node) {
> + if (qb->queue == q) {
> + ret = -EBUSY;
> + goto out;
> + }
> + }
> +
> + qb = kzalloc(sizeof(*qb), GFP_KERNEL);
> + if (!qb) {
> + ret = -ENOMEM;
> + goto out;
> + }
> +
> + /*
> + * TODO should be prepare the buffer here if needed, to
> report errors
> + * early?
> + */
> + qb->pre_req_state = vb->state;
> + qb->queue = q;
> + memcpy(&qb->v4l2_buf, b, sizeof(*b));
I am getting data corruption on qb->v4l2_buf.m.planes from this when
using planar buffers, only after exiting the ioctl handler (i.e. when
accessing this buffer later from the queue).
I initially thought this was because the planes pointer was copied as-is
from userspace, but Maxime Ripard suggested that this would have
automatically triggered a visible fault in the kernel.
Thus, my best guess is that the data is properly copied from userspace
but freed when leaving the ioctl handler, which doesn't work our with
the request API.
A dirty fix that I came up with consists in re-allocating the planes
buffer here and copying its contents from "b", so that it can live
beyond the ioctl call.
I am not too sure whether this should be fixed here or in the part of
the v4l2 common code that frees this data. What do you think?
Cheers!
--
Paul Kocialkowski, Bootlin (formerly Free Electrons)
Embedded Linux and kernel engineering
https://bootlin.com
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
next prev parent reply other threads:[~2018-03-07 16:51 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-20 4:44 [RFCv4 00/21] Request API Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 01/21] media: add request API core and UAPI Alexandre Courbot
2018-02-20 10:36 ` Hans Verkuil
2018-02-21 6:01 ` Alexandre Courbot
2018-02-21 7:29 ` Hans Verkuil
2018-02-22 9:30 ` Alexandre Courbot
2018-02-22 9:38 ` Hans Verkuil
2018-02-20 4:44 ` [RFCv4 02/21] v4l2-ctrls: v4l2_ctrl_add_handler: add from_other_dev Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 03/21] v4l2-ctrls: prepare internal structs for request API Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 04/21] v4l2-ctrls: add core " Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 05/21] v4l2-ctrls: use ref in helper instead of ctrl Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 06/21] v4l2-ctrls: support g/s_ext_ctrls for requests Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 07/21] v4l2-ctrls: add v4l2_ctrl_request_setup Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 08/21] [WAR] v4l2-ctrls: do not clone non-standard controls Alexandre Courbot
2018-02-20 13:05 ` Hans Verkuil
2018-02-20 4:44 ` [RFCv4 09/21] v4l2: add request API support Alexandre Courbot
2018-02-20 7:36 ` Philippe Ombredanne
2018-02-20 8:03 ` Alexandre Courbot
2018-02-20 13:25 ` Hans Verkuil
2018-02-21 6:01 ` Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 10/21] videodev2.h: Add request_fd field to v4l2_buffer Alexandre Courbot
2018-02-20 15:20 ` Hans Verkuil
2018-02-21 6:01 ` Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 11/21] media: v4l2_fh: add request entity field Alexandre Courbot
2018-02-20 15:24 ` Hans Verkuil
2018-02-21 6:01 ` Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 12/21] media: videobuf2: add support for requests Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 13/21] media: videobuf2-v4l2: " Alexandre Courbot
2018-02-20 16:18 ` Hans Verkuil
2018-02-21 6:01 ` Alexandre Courbot
2018-02-23 6:34 ` Tomasz Figa
2018-02-23 7:21 ` Hans Verkuil
2018-02-23 7:33 ` Tomasz Figa
2018-02-23 7:43 ` Hans Verkuil
2018-03-07 16:50 ` Paul Kocialkowski [this message]
2018-03-08 13:50 ` [RFCv4,13/21] " Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 14/21] videodev2.h: add request_fd field to v4l2_ext_controls Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 15/21] v4l2-ctrls: support requests in EXT_CTRLS ioctls Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 16/21] v4l2: video_device: support for creating requests Alexandre Courbot
2018-02-20 16:35 ` Hans Verkuil
2018-02-21 6:01 ` Alexandre Courbot
2018-02-21 7:37 ` Hans Verkuil
2018-02-20 4:44 ` [RFCv4 17/21] media: mem2mem: support for requests Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 18/21] Documentation: v4l: document request API Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 19/21] media: vim2m: add request support Alexandre Courbot
2018-03-07 16:37 ` [RFCv4,19/21] " Paul Kocialkowski
2018-03-08 13:48 ` Alexandre Courbot
2018-03-09 14:35 ` Paul Kocialkowski
2018-03-13 10:24 ` Alexandre Courbot
2018-03-14 13:25 ` Paul Kocialkowski
2018-03-19 9:17 ` Alexandre Courbot
2018-03-11 19:40 ` Dmitry Osipenko
2018-03-11 19:42 ` Dmitry Osipenko
2018-03-12 8:10 ` Paul Kocialkowski
2018-03-12 8:15 ` Tomasz Figa
2018-03-12 8:25 ` Paul Kocialkowski
2018-03-12 8:29 ` Tomasz Figa
2018-03-12 12:21 ` Dmitry Osipenko
2018-03-12 12:32 ` Alexandre Courbot
2018-03-12 14:44 ` Dmitry Osipenko
2018-02-20 4:44 ` [RFCv4 20/21] media: vivid: add request support for the video capture device Alexandre Courbot
2018-02-20 4:44 ` [RFCv4 21/21] [WIP] media: media-device: support for creating requests Alexandre Courbot
2018-02-20 4:54 ` [RFCv4 00/21] Request API Alexandre Courbot
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=1520441424.1092.25.camel@bootlin.com \
--to=paul.kocialkowski@bootlin.com \
--cc=acourbot@chromium.org \
--cc=gustavo.padovan@collabora.com \
--cc=hverkuil@xs4all.nl \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=m.szyprowski@samsung.com \
--cc=maxime.ripard@bootlin.com \
--cc=mchehab@kernel.org \
--cc=posciak@chromium.org \
--cc=sakari.ailus@linux.intel.com \
--cc=tfiga@chromium.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).