All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Cc: linux-media@vger.kernel.org, sakari.ailus@linux.intel.com,
	Jacopo Mondi <jacopo+renesas@jmondi.org>,
	niklas.soderlund+renesas@ragnatech.se,
	Mauro Carvalho Chehab <mchehab@kernel.org>,
	Hans Verkuil <hverkuil-cisco@xs4all.nl>,
	Pratyush Yadav <p.yadav@ti.com>,
	Lokesh Vutla <lokeshvutla@ti.com>,
	Kieran Bingham <kieran.bingham@ideasonboard.com>
Subject: Re: [PATCH v8 00/36] v4l: subdev internal routing and streams
Date: Mon, 27 Sep 2021 04:24:53 +0300	[thread overview]
Message-ID: <YVEdZaVRMmUiQucx@pendragon.ideasonboard.com> (raw)
In-Reply-To: <9b47fd13-ef1f-450f-869d-4220702479e5@ideasonboard.com>

Hi Tomi,

On Mon, Sep 20, 2021 at 01:19:54PM +0300, Tomi Valkeinen wrote:
> On 30/08/2021 14:00, Tomi Valkeinen wrote:
> > Hi,
> > 
> > This is v8 of the multiplexed streams series. v7 can be found from:
> > 
> > https://lore.kernel.org/linux-media/20210524104408.599645-1-tomi.valkeinen@ideasonboard.com/
> > 
> > The main change in this version is the implementation and use of
> > centralized active state for subdevs.
> > 
> > I have pushed my work branch to:
> > 
> > git://git.kernel.org/pub/scm/linux/kernel/git/tomba/linux.git multistream/work-v8
> > 
> > which contains the patches in this series, along with subdev drivers
> > using multiplexed streams.
> > 
> > Both this series and the branch above are based on top of today's
> > git://linuxtv.org/media_tree.git master.
> > 
> > The documentation still needs improving, but I hope the docs in this
> > series, and the drivers in the work branch, are enough to give the
> > reviewers enough information to do a review.
> > 
> > As can be guessed from the work branch, I have been testing this series
> > with TI's FPDLink setup. I have also done a "backwards compatibility"
> > test by dropping all multiplexed streams patches from the CAL driver
> > (the CSI-2 RX on the TI SoC), and using the FPDLink drivers with
> > single-stream configuration.
> 
> We've had good discussions with Jacopo about this series.

I hope my recent contribution was also useful to some extent :-) Up to
patch 04/36, I like the direction this is taking and I'm quite confident
that we'll reach an agreement. We need to get feedback from Sakari too
though.

> I chose the approaches in this series based on what I think the API 
> should be, even if the API has behaved differently before. And I think 
> I'm also leaning forward a bit, in the sense that the full benefit of 
> the API can only be had after more changes to the core and subdev 
> drivers (changes which may or may not happen).
> 
> If I understood Jacopo correctly, his comments were essentially that my 
> approach is different than the current one, and as the current drivers 
> anyway do things the old way, this is very confusing. Basically I create 
> two different kinds of subdev drivers: the old and new ones, which 
> manage state differently.
> 
> I want to summarize two particular topics:
> 
> 1) Active state & subdev ops
> 
> In upstream we have v4l2_subdev_state which contains only the pad_config 
> array. This state is "try" state, it's allocated per file-handle, and 
> passed to the subdev drivers when executing subdev ioctls in try-mode 
> (which == V4L2_SUBDEV_FORMAT_TRY). This try-state is sometimes also 
> passed to the subdev drivers when executing in active-mode 
> (V4L2_SUBDEV_FORMAT_ACTIVE), but the drivers are supposed to ignore it.
> 
> There is also an active-state, but it's driver-specific and 
> driver-internal. The drivers check the 'which' value, and either use the 
> passed try-state, or the internal state.

To be very clear here, let's note that the driver-internal state is
stored in a driver-specific format, which does not reuse the state
structure used for the TRY state.

> What I did in this series aims to have both try- and active-states in 
> v4l2 core, and passing the correct state to subdevs so that they don't 
> (necessarily) need any internal state. There are some issues with it, 
> which have been discussed, but I believe those issues can be fixed.
> 
> The subdev drivers need to be written to use this new active-state, so 
> it doesn't affect the current drivers.
> 
> The question is, do we want to go that way?

__     __  _______   ________
\ \   / / |  _____| |  ______|
 \ \ / /  | |       | |
  \ v /   | |_____  | |______
   | |    |  _____| |______  |
   | |    | |              | |
   | |    | |_____   ______| |
   |_|    |_______| |________|

(please let me know if you require additional clarification)

> We could as well keep the 
> current behavior of subdev drivers only getting the try-state as a 
> parameter, and the drivers digging out the active state manually. This 
> active state could either be internal to the driver, or it could be in 
> the base struct v4l2_subdev (see also topic 2).
> 
> 2) Shared subdev active-state
> 
> The try-state is specific to a file-handle, and afaics have no real 
> race-issues as it's not really shared. Although I guess in theory an 
> application could call subdev ioctls from multiple threads using the 
> same fd.

That's right. We could possibly serialize ioctl calls in v4l2-subdev.c.

> In upstream the subdev drivers' internal state is managed fully by the 
> subdev drivers. The drivers are expected to handle necessary locking in 
> their subdev ops and interrupt handlers. If, say, v4l2 core needs to get 
> a format from the subdev, it calls a subdev op to get it.

"supposed to" is the correct term here. Most of them don't (including
drivers I have written myself), which I believe shows quite clearly that
the API is wrong and that this shouldn't be left to drivers to handle.

> In my series I aimed to a shared active-state. The state is located in a 
> known place, struct v4l2_subdev, and can be accessed without the subdev 
> driver's help. This requires locking, which I have implemented.
> 
> At the moment the only real benefit with this is reading the routing 
> table while doing pipeline validation: Instead of having to dynamically 
> allocate memory and call the subdev op to create a copy of the routing 
> table (for each subdev, possibly multiple times), the validator can just 
> lock the state, and use it. And, in fact, there is no get_routing subdev 
> op at all.
> 
> But this means that the subdev drivers that support this new 
> active-state have to handle locking for the active state, and the 
> "mindset" is different than previously.

That's the right mindset I believe, and forcing drivers to use helper
functions that ensure proper locking is the right way to go in my
opinion.

> So the question is, do we want to go that way? We could as well mandate 
> that the active-state can only be accessed via subdev's ops (and add the 
> get-routing, of course), and the subdev manages the locking internally.

Been there, failed, let's not repeat the same mistake.

-- 
Regards,

Laurent Pinchart

  reply	other threads:[~2021-09-27  1:25 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-30 11:00 [PATCH v8 00/36] v4l: subdev internal routing and streams Tomi Valkeinen
2021-08-30 11:00 ` [PATCH v8 01/36] media: subdev: rename subdev-state alloc & free Tomi Valkeinen
2021-09-26 23:06   ` Laurent Pinchart
2021-09-27  6:38     ` Tomi Valkeinen
2021-08-30 11:00 ` [PATCH v8 02/36] media: subdev: add active state to struct v4l2_subdev Tomi Valkeinen
2021-09-13 10:57   ` Jacopo Mondi
2021-09-13 12:00     ` Tomi Valkeinen
2021-09-15  9:44   ` Jacopo Mondi
2021-09-16  6:17     ` Tomi Valkeinen
2021-09-16  6:52       ` Tomi Valkeinen
2021-09-16  8:08         ` Jacopo Mondi
2021-09-16  9:36           ` Tomi Valkeinen
2021-09-26 23:58             ` Laurent Pinchart
2021-09-27  7:05               ` Tomi Valkeinen
2021-09-27  9:39                 ` Laurent Pinchart
2021-09-28  5:14                   ` Tomi Valkeinen
2021-09-28 12:33                     ` Tomi Valkeinen
2021-09-29 15:41                       ` Laurent Pinchart
2021-08-30 11:00 ` [PATCH v8 03/36] media: subdev: add 'which' to subdev state Tomi Valkeinen
2021-09-13 11:41   ` Jacopo Mondi
2021-09-13 12:17     ` Tomi Valkeinen
2021-09-13 13:38       ` Jacopo Mondi
2021-09-13 14:26         ` Tomi Valkeinen
2021-09-16 13:07           ` Jacopo Mondi
2021-09-16 13:24             ` Tomi Valkeinen
2021-09-27  0:48               ` Laurent Pinchart
2021-09-27  8:55                 ` Tomi Valkeinen
2021-09-27 10:49                   ` Laurent Pinchart
2021-09-27  0:46             ` Laurent Pinchart
2021-09-27  8:35               ` Tomi Valkeinen
2021-09-27 10:01                 ` Laurent Pinchart
2021-08-30 11:00 ` [PATCH v8 04/36] media: subdev: pass also the active state to subdevs from ioctls Tomi Valkeinen
2021-09-15 10:17   ` Jacopo Mondi
2021-09-16  6:44     ` Tomi Valkeinen
2021-09-16  8:02       ` Jacopo Mondi
2021-09-16  8:43         ` Tomi Valkeinen
2021-09-27  1:13           ` Laurent Pinchart
2021-08-30 11:00 ` [PATCH v8 05/36] media: subdev: add subdev state locking Tomi Valkeinen
2021-09-27  1:35   ` Laurent Pinchart
2021-09-27  9:49     ` Tomi Valkeinen
2021-09-27 10:06       ` Laurent Pinchart
2021-08-30 11:00 ` [PATCH v8 06/36] media: subdev: Add v4l2_subdev_validate(_and_lock)_state() Tomi Valkeinen
2021-09-27  1:45   ` Laurent Pinchart
2021-09-28  5:02     ` Tomi Valkeinen
2021-09-28  7:52       ` Laurent Pinchart
2021-09-29 15:35         ` Tomi Valkeinen
2021-09-29 15:39           ` Laurent Pinchart
2021-08-30 11:00 ` [PATCH v8 07/36] media: Documentation: add documentation about subdev state Tomi Valkeinen
2021-08-30 11:00 ` [PATCH v8 08/36] media: entity: Use pad as a starting point for graph walk Tomi Valkeinen
2021-08-30 11:00 ` [PATCH v8 09/36] media: entity: Use pads instead of entities in the media graph walk stack Tomi Valkeinen
2021-08-30 11:00 ` [PATCH v8 10/36] media: entity: Walk the graph based on pads Tomi Valkeinen
2021-08-30 11:00 ` [PATCH v8 11/36] media: mc: Start walk from a specific pad in use count calculation Tomi Valkeinen
2021-08-30 11:00 ` [PATCH v8 12/36] media: entity: Add iterator helper for entity pads Tomi Valkeinen
2021-08-30 11:00 ` [PATCH v8 13/36] media: entity: Move the pipeline from entity to pads Tomi Valkeinen
2021-08-30 11:00 ` [PATCH v8 14/36] media: entity: Use pad as the starting point for a pipeline Tomi Valkeinen
2021-08-30 11:00 ` [PATCH v8 15/36] media: entity: Add has_route entity operation Tomi Valkeinen
2021-08-30 11:00 ` [PATCH v8 16/36] media: entity: Add media_entity_has_route() function Tomi Valkeinen
2021-08-30 11:00 ` [PATCH v8 17/36] media: entity: Use routing information during graph traversal Tomi Valkeinen
2021-08-30 11:00 ` [PATCH v8 18/36] media: entity: Skip link validation for pads to which there is no route Tomi Valkeinen
2021-08-30 11:00 ` [PATCH v8 19/36] media: entity: Add an iterator helper for connected pads Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 20/36] media: entity: Add only connected pads to the pipeline Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 21/36] media: entity: Add debug information in graph walk route check Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 22/36] media: Add bus type to frame descriptors Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 23/36] media: Add CSI-2 bus configuration " Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 24/36] media: Add stream to frame descriptor Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 25/36] media: subdev: increase V4L2_FRAME_DESC_ENTRY_MAX to 8 Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 26/36] media: add V4L2_SUBDEV_FL_MULTIPLEXED Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 27/36] media: Documentation: Add GS_ROUTING documentation Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 28/36] media: subdev: Add [GS]_ROUTING subdev ioctls and operations Tomi Valkeinen
2021-09-15 16:10   ` Jacopo Mondi
2021-09-16  6:57     ` Tomi Valkeinen
2021-10-03 19:52   ` Dafna Hirschfeld
2021-10-04  5:15     ` Tomi Valkeinen
2021-10-05 10:19       ` Dafna Hirschfeld
2021-10-05 10:54         ` Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 29/36] media: subdev: add v4l2_subdev_has_route() Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 30/36] media: subdev: add v4l2_subdev_set_routing helper() Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 31/36] media: subdev: add stream based configuration Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 32/36] media: subdev: use streams in v4l2_subdev_link_validate() Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 33/36] media: subdev: add "opposite" stream helper funcs Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 34/36] media: subdev: add v4l2_subdev_get_fmt() helper function Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 35/36] media: subdev: add v4l2_subdev_set_routing_with_fmt() helper Tomi Valkeinen
2021-08-30 11:01 ` [PATCH v8 36/36] media: subdev: add v4l2_routing_simple_verify() helper Tomi Valkeinen
2021-09-20 10:19 ` [PATCH v8 00/36] v4l: subdev internal routing and streams Tomi Valkeinen
2021-09-27  1:24   ` Laurent Pinchart [this message]
2021-09-28  7:59     ` Jacopo Mondi

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=YVEdZaVRMmUiQucx@pendragon.ideasonboard.com \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=hverkuil-cisco@xs4all.nl \
    --cc=jacopo+renesas@jmondi.org \
    --cc=kieran.bingham@ideasonboard.com \
    --cc=linux-media@vger.kernel.org \
    --cc=lokeshvutla@ti.com \
    --cc=mchehab@kernel.org \
    --cc=niklas.soderlund+renesas@ragnatech.se \
    --cc=p.yadav@ti.com \
    --cc=sakari.ailus@linux.intel.com \
    --cc=tomi.valkeinen@ideasonboard.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.