Re: [PATCHv3 0/3] media: mc: add manual request completion support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thank you Nicolas for the explanation.

On Fri, Oct 4, 2024 at 7:54 PM Nicolas Dufresne
<nicolas.dufresne@xxxxxxxxxxxxx> wrote:
>
> Hi Steve,
>
> Le jeudi 03 octobre 2024 à 15:03 -0700, Steve Cho a écrit :
> > Hi Hans,
> >
> > Few questions here.
> > After this patch, is there any need to reflect in the Request API doc?
> >
> > On Thu, Aug 29, 2024 at 3:58 AM Hans Verkuil <hverkuil-cisco@xxxxxxxxx> wrote:
> > >
> > > Normally a request contains one or more request objects, and once all
> > > objects are marked as 'completed' the request itself is completed and
> > > userspace gets a signal that the request is complete.
> > >
> > > Calling vb2_buffer_done will complete a buffer object, and
> > > v4l2_ctrl_request_complete will complete a control handler object.
> > >
> > > In some cases (e.g. VP9 codecs) there is only a buffer object, so
> > What codecs have the same behavior here?
> > How are things different with other codecs?
>
> CODECs with single header are typically affected. VP9 have no sequence header of
> any sort. Userspace will have to set an initial VP9 Frame header out of request
> in order to negotiate the format with the driver. VP8 and AV1 are also possible
> candidates.
>
> >
> > > as soon as the buffer is marked done, the request is marked as
> > > completed. But in the case of mediatek, while the buffer is done
> > > (i.e. the data is consumed by the hardware), the request isn't
> > > completed yet as the data is still being processed. Once the
> > This sounds like standard HW behavior to me...
> > How is it different on rockchip, which I heard was not reproducing this issue?
>
> This only affects MTK VCODEC, and only very recent version of Chromium. Event if
I assume you are referring to what we call "v4l2 flat stateless"
implementation.
This was developed, but it was not enabled.

> Hantro and RKVDEC are not affected, at the time RK3399 support was dropped by
> ChromeOS team, Chromium was still sending all the controls into all the request.
> Incidently, we never tested the effect of having request without controls.
>
> The intention here is to give drivers the control over when the following steps
> occurs. In practice, the most logical event signalling order would be:
>
> - Apply the new controls to the global state
> - Mark the bitstream buffer done (bitstream buffers can immediately be refilled)
> - Mark the picture buffer done
> - Signal the request completion
>
> But all drivers, except MTK, uses the helper v4l2_m2m_buf_done_and_job_finish(),
> which imply
>
> - Apply the new controls to the global state
> - Mark the picture buffer done
> - Mark the bitstream buffer done
> - After which the last object in the request is dropped and the implicit
> signalling triggers
>
> In order to render the bistream buffers available earlier to user space, the MTK
> driver is currently delaying the application of controls. But if there is no
> control object in the request, this mechanism is not working and lead to the
> splat we are trying to fix in a clean way.
>
> Nicolas
>
> >
> > > data is fully processed, the driver wants to call
> > > v4l2_ctrl_request_complete() which will either update an existing
> > > control handler object, or add a new control handler object to the
> > > request containing the latest control values. But since the
> > > request is already completed, calling v4l2_ctrl_request_complete()
> > > will fail.
> > >
> > > One option is to simply postpone calling vb2_buffer_done() and do
> > > it after the call to v4l2_ctrl_request_complete(). However, in some
> > > use-cases (e.g. secure memory) the number of available buffers is
> > > very limited and you really want to return a buffer as soon as
> > > possible.
> > >
> > > In that case you want to postpone request completion until you
> > > know the request is really ready.
> > >
> > > Originally I thought the best way would be to make a dummy request
> > > object, but that turned out to be overly complicated. So instead
> > > I just add a bool manual_completion, which you set to true in
> > > req_queue, and you call media_request_manual_complete() when you
> > > know the request is complete. That was a lot less complicated.
> > >
> > > The first patch adds this new manual completion code, the second
> > > patch adds this to vicodec so it is included in regression testing,
> > > and the last patch is an updated old patch of mine that adds debugfs
> > > code to check if all requests and request objects are properly freed.
> > > Without it it is really hard to verify that there are no dangling
> > > requests or objects.
> > >
> > > I prefer to merge this third patch as well, but if there are
> > > objections, then I can live without it.
> > >
> > > Regards,
> > >
> > >         Hans
> > >
> > > Changes since v2:
> > > - fixed use-after-free bug in the third patch in media_request_object_release().
> > >
> > > Changes since the RFC:
> > >
> > > - Added WARN_ONs
> > > - vicodec was calling media_request_manual_complete() without
> > >   checking that it was the stateless output queue first.
> > > - Some minor cleanups in patch 3.
> > >
> > > Hans Verkuil (3):
> > >   media: mc: add manual request completion
> > >   media: vicodec: add support for manual completion
> > >   media: mc: add debugfs node to keep track of requests
> > >
> > >  drivers/media/mc/mc-device.c                  | 30 +++++++++++++
> > >  drivers/media/mc/mc-devnode.c                 |  5 +++
> > >  drivers/media/mc/mc-request.c                 | 44 ++++++++++++++++++-
> > >  .../media/test-drivers/vicodec/vicodec-core.c | 21 +++++++--
> > >  include/media/media-device.h                  |  9 ++++
> > >  include/media/media-devnode.h                 |  4 ++
> > >  include/media/media-request.h                 | 38 +++++++++++++++-
> > >  7 files changed, 144 insertions(+), 7 deletions(-)
> > >
> > > --
> > > 2.43.0
> > >
> > >
>





[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux