All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFCv12 PATCH 00/29] Request API
@ 2018-05-01  9:00 Hans Verkuil
  2018-05-01  9:00 ` [RFCv12 PATCH 01/29] v4l2-device.h: always expose mdev Hans Verkuil
                   ` (28 more replies)
  0 siblings, 29 replies; 39+ messages in thread
From: Hans Verkuil @ 2018-05-01  9:00 UTC (permalink / raw)
  To: linux-media

From: Hans Verkuil <hans.verkuil@cisco.com>

Hi all,

This is version 12 of the Request API series.

The main changes compared to v11 are:

- Improve locking (more about that below)
- Split req_queue into req_validate and req_queue
- Add vb2_m2m_request_queue() helper
- Merge v11 patches 3-5 into one (splitting it up was too confusing)
- Incorporated all (?) v11 comments, except for debug_str: it wasn't
  quite clear to me what I should do there.
- Renamed WHICH_REQUEST to WHICH_REQUEST_VAL for consistency.
- Attempting to queue or reinit a request that is in use will now
  return -EBUSY instead of -EINVAL.
- Added a final RFC patch to ease debugging: it exposes a debugfs
  file that shows how many requests and request objects are in use.
  I don't think this will be merged as I am not really happy about
  it. It's good enough for now, though.

This series has been tested with vim2m, vivid and the cedrus driver.

Regarding locking:

There are two request locks used: req_queue_mutex (part of media_device)
ensures high-level serialization of queueing/reiniting and canceling
requests. It serializes STREAMON/OFF, TRY/S_EXT_CTRLS, close() and
MEDIA_REQUEST_IOC_QUEUE. This is the top-level lock and should be taken
before any others.

The lock spin_lock in struct media_request protects that structure and
should be held for a short time only.

Note that VIDIOC_QBUF/VIDIOC_PREPARE_BUF do not take this mutex: when
a buffer is queued/prepared for a request they will add it to the
request by calling media_request_object_bind(), and that returns an
error if the request is in the wrong state. It is serialized via the
spin_lock which in this specific case is sufficient.

When MEDIA_REQUEST_IOC_QUEUE is called it will validate and queue both
control handlers and vb2 buffers. For control handlers the control handler
lock will be taken, for vb2 buffers the vb2_queue lock will be taken.
This requires that the lock field in vb2_queue is set, which is checked in
videobuf2-v4l2.c.

TODO/Remarks:

1) Still some missing documentation. It's better than v11, but still
   not complete.

2) No VIDIOC_REQUEST_ALLOC 'shortcut' ioctl. I don't think we should
   add this in the initial version due to the fact that it is somewhat
   controversial. It can always be added later.

3) vim2m: the media topology is a bit bogus, this needs to be fixed
   (i.e. a proper HW entity should be added). But for now it is
   good enough for testing. In addition as suggested by Tomasz the
   timer can be replaced by delayed_work.

4) Review copyright/authorship lines. I'm not sure if everything is
   correct. Alexandre, Sakari, if you see something that is not
   right in this respect, just let me know!

5) For the next patch series I plan to drop the 'RFC' tag, except for
   the last debugfs patch.

Everything seemed to slip nicely into place while working on this,
so I hope this is finally an implementation that we can proceed to
upstream and build upon for complex camera pipelines in the future.

This patch series is also available here:

https://git.linuxtv.org/hverkuil/media_tree.git/log/?h=reqv12

Regards,

	Hans


Alexandre Courbot (2):
  videodev2.h: add request_fd field to v4l2_ext_controls
  Documentation: v4l: document request API

Hans Verkuil (27):
  v4l2-device.h: always expose mdev
  uapi/linux/media.h: add request API
  media-request: implement media requests
  v4l2-dev: lock req_queue_mutex
  media-request: add media_request_find
  media-request: add media_request_object_find
  v4l2-ctrls: v4l2_ctrl_add_handler: add from_other_dev
  v4l2-ctrls: prepare internal structs for request API
  v4l2-ctrls: alloc memory for p_req
  v4l2-ctrls: use ref in helper instead of ctrl
  v4l2-ctrls: add core request support
  v4l2-ctrls: support g/s_ext_ctrls for requests
  videodev2.h: Add request_fd field to v4l2_buffer
  vb2: store userspace data in vb2_v4l2_buffer
  videobuf2-core: embed media_request_object
  videobuf2-core: integrate with media requests
  videobuf2-v4l2: integrate with media requests
  videobuf2-core: add vb2_core_request_has_buffers
  videobuf2-v4l2: add vb2_request_queue/validate helpers
  videobuf2-v4l2: export request_fd
  v4l2-mem2mem: add vb2_m2m_request_queue
  media: vim2m: add media device
  vim2m: use workqueue
  vim2m: support requests
  vivid: add mc
  vivid: add request support
  RFC: media-requests: add debugfs node

 Documentation/media/uapi/v4l/buffer.rst       |  19 +-
 Documentation/media/uapi/v4l/common.rst       |   1 +
 Documentation/media/uapi/v4l/request-api.rst  | 218 ++++++++
 .../media/uapi/v4l/vidioc-g-ext-ctrls.rst     |  25 +-
 Documentation/media/uapi/v4l/vidioc-qbuf.rst  |   8 +
 .../media/videodev2.h.rst.exceptions          |   1 +
 drivers/media/Makefile                        |   3 +-
 .../media/common/videobuf2/videobuf2-core.c   | 204 +++++--
 .../media/common/videobuf2/videobuf2-v4l2.c   | 456 ++++++++++------
 drivers/media/dvb-core/dvb_vb2.c              |   5 +-
 drivers/media/dvb-frontends/rtl2832_sdr.c     |   5 +-
 drivers/media/media-device.c                  |  54 ++
 drivers/media/media-devnode.c                 |  17 +
 drivers/media/media-request.c                 | 492 +++++++++++++++++
 drivers/media/pci/bt8xx/bttv-driver.c         |   2 +-
 drivers/media/pci/cx23885/cx23885-417.c       |   2 +-
 drivers/media/pci/cx88/cx88-blackbird.c       |   2 +-
 drivers/media/pci/cx88/cx88-video.c           |   2 +-
 drivers/media/pci/saa7134/saa7134-empress.c   |   4 +-
 drivers/media/pci/saa7134/saa7134-video.c     |   2 +-
 .../media/platform/exynos4-is/fimc-capture.c  |   2 +-
 drivers/media/platform/omap3isp/ispvideo.c    |   4 +-
 drivers/media/platform/rcar-vin/rcar-v4l2.c   |   3 +-
 drivers/media/platform/rcar_drif.c            |   2 +-
 .../media/platform/s3c-camif/camif-capture.c  |   4 +-
 drivers/media/platform/s5p-mfc/s5p_mfc_dec.c  |   4 +-
 drivers/media/platform/s5p-mfc/s5p_mfc_enc.c  |   4 +-
 .../media/platform/soc_camera/soc_camera.c    |   7 +-
 drivers/media/platform/vim2m.c                |  83 ++-
 drivers/media/platform/vivid/vivid-core.c     |  69 +++
 drivers/media/platform/vivid/vivid-core.h     |   8 +
 drivers/media/platform/vivid/vivid-ctrls.c    |  46 +-
 .../media/platform/vivid/vivid-kthread-cap.c  |  12 +
 .../media/platform/vivid/vivid-kthread-out.c  |  12 +
 drivers/media/platform/vivid/vivid-sdr-cap.c  |   8 +
 drivers/media/platform/vivid/vivid-vbi-cap.c  |   2 +
 drivers/media/platform/vivid/vivid-vbi-out.c  |   2 +
 drivers/media/platform/vivid/vivid-vid-cap.c  |   2 +
 drivers/media/platform/vivid/vivid-vid-out.c  |   2 +
 drivers/media/usb/cpia2/cpia2_v4l.c           |   2 +-
 drivers/media/usb/cx231xx/cx231xx-417.c       |   2 +-
 drivers/media/usb/cx231xx/cx231xx-video.c     |   4 +-
 drivers/media/usb/msi2500/msi2500.c           |   2 +-
 drivers/media/usb/tm6000/tm6000-video.c       |   2 +-
 drivers/media/usb/uvc/uvc_queue.c             |   5 +-
 drivers/media/usb/uvc/uvc_v4l2.c              |   3 +-
 drivers/media/usb/uvc/uvcvideo.h              |   1 +
 drivers/media/v4l2-core/v4l2-compat-ioctl32.c |  14 +-
 drivers/media/v4l2-core/v4l2-ctrls.c          | 496 +++++++++++++++++-
 drivers/media/v4l2-core/v4l2-dev.c            |  37 +-
 drivers/media/v4l2-core/v4l2-device.c         |   3 +-
 drivers/media/v4l2-core/v4l2-ioctl.c          |  22 +-
 drivers/media/v4l2-core/v4l2-mem2mem.c        |  40 +-
 drivers/media/v4l2-core/v4l2-subdev.c         |   9 +-
 .../staging/media/davinci_vpfe/vpfe_video.c   |   3 +-
 drivers/staging/media/imx/imx-media-dev.c     |   2 +-
 drivers/staging/media/imx/imx-media-fim.c     |   2 +-
 drivers/staging/media/omap4iss/iss_video.c    |   3 +-
 drivers/usb/gadget/function/uvc_queue.c       |   2 +-
 include/media/media-device.h                  |  28 +
 include/media/media-devnode.h                 |   4 +
 include/media/media-request.h                 | 228 ++++++++
 include/media/v4l2-ctrls.h                    |  45 +-
 include/media/v4l2-device.h                   |   4 +-
 include/media/v4l2-mem2mem.h                  |   4 +
 include/media/videobuf2-core.h                |  38 +-
 include/media/videobuf2-v4l2.h                |  20 +-
 include/uapi/linux/media.h                    |  12 +
 include/uapi/linux/videodev2.h                |  14 +-
 69 files changed, 2519 insertions(+), 330 deletions(-)
 create mode 100644 Documentation/media/uapi/v4l/request-api.rst
 create mode 100644 drivers/media/media-request.c
 create mode 100644 include/media/media-request.h

-- 
2.17.0

^ permalink raw reply	[flat|nested] 39+ messages in thread

end of thread, other threads:[~2018-05-03 10:30 UTC | newest]

Thread overview: 39+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-01  9:00 [RFCv12 PATCH 00/29] Request API Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 01/29] v4l2-device.h: always expose mdev Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 02/29] uapi/linux/media.h: add request API Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 03/29] media-request: implement media requests Hans Verkuil
2018-05-02 12:24   ` Hans Verkuil
2018-05-02 22:24   ` Sakari Ailus
2018-05-03  8:21     ` Hans Verkuil
2018-05-03 10:12       ` Sakari Ailus
2018-05-03 10:29         ` Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 04/29] v4l2-dev: lock req_queue_mutex Hans Verkuil
2018-05-02  8:10   ` Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 05/29] media-request: add media_request_find Hans Verkuil
2018-05-02 22:06   ` Sakari Ailus
2018-05-03  8:31     ` Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 06/29] media-request: add media_request_object_find Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 07/29] videodev2.h: add request_fd field to v4l2_ext_controls Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 08/29] v4l2-ctrls: v4l2_ctrl_add_handler: add from_other_dev Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 09/29] v4l2-ctrls: prepare internal structs for request API Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 10/29] v4l2-ctrls: alloc memory for p_req Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 11/29] v4l2-ctrls: use ref in helper instead of ctrl Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 12/29] v4l2-ctrls: add core request support Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 13/29] v4l2-ctrls: support g/s_ext_ctrls for requests Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 14/29] videodev2.h: Add request_fd field to v4l2_buffer Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 15/29] vb2: store userspace data in vb2_v4l2_buffer Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 16/29] videobuf2-core: embed media_request_object Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 17/29] videobuf2-core: integrate with media requests Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 18/29] videobuf2-v4l2: " Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 19/29] videobuf2-core: add vb2_core_request_has_buffers Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 20/29] videobuf2-v4l2: add vb2_request_queue/validate helpers Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 21/29] videobuf2-v4l2: export request_fd Hans Verkuil
2018-05-02  8:14   ` Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 22/29] v4l2-mem2mem: add vb2_m2m_request_queue Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 23/29] Documentation: v4l: document request API Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 24/29] media: vim2m: add media device Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 25/29] vim2m: use workqueue Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 26/29] vim2m: support requests Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 27/29] vivid: add mc Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 28/29] vivid: add request support Hans Verkuil
2018-05-01  9:00 ` [RFCv12 PATCH 29/29] RFC: media-requests: add debugfs node Hans Verkuil

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.