lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <15df046b-0fe1-4b57-acad-66b88beac982@kernel.org>
Date: Mon, 22 Sep 2025 09:44:02 +0200
From: Hans Verkuil <hverkuil+cisco@...nel.org>
To: Jai Luthra <jai.luthra@...asonboard.com>,
 Hans Verkuil <hverkuil@...nel.org>,
 Mauro Carvalho Chehab <mchehab@...nel.org>,
 Sakari Ailus <sakari.ailus@...ux.intel.com>,
 Laurent Pinchart <laurent.pinchart@...asonboard.com>,
 Tomi Valkeinen <tomi.valkeinen@...asonboard.com>,
 Jacopo Mondi <jacopo.mondi@...asonboard.com>, linux-media@...r.kernel.org
Cc: Ricardo Ribalda <ribalda@...omium.org>,
 Laurent Pinchart <laurent.pinchart+renesas@...asonboard.com>,
 Al Viro <viro@...iv.linux.org.uk>, Ma Ke <make24@...as.ac.cn>,
 linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2 01/10] media: v4l2-core: Introduce state management for
 video devices

Hi Jai,

Apologies that I had no time to review v1, but I'll review v2 today.

On 19/09/2025 11:55, Jai Luthra wrote:
> Similar to V4L2 subdev states, introduce state support for video devices
> to provide a centralized location for storing device state information.
> This includes the current (active) pixelformat used by the device and
> the temporary (try) pixelformat used during format negotiation. In the
> future, this may be extended or subclassed by device drivers to store
> their internal state variables.
> 
> Also introduce a flag for drivers that wish to use this state
> management. When set, the framework automatically allocates the state
> during device registration and stores a pointer to it within the
> video_device structure.
> 
> This change aligns video devices with V4L2 subdevices by storing
> hardware state in a common framework-allocated structure. This is the
> first step towards enabling the multiplexing of the underlying hardware
> by using different software "contexts", each represented by the combined
> state of all video devices and V4L2 subdevices in a complex media graph.
> 
> Signed-off-by: Jai Luthra <jai.luthra@...asonboard.com>
> --
> Cc: Mauro Carvalho Chehab <mchehab@...nel.org>
> Cc: Hans Verkuil <hverkuil@...nel.org>
> Cc: Ricardo Ribalda <ribalda@...omium.org>
> Cc: Laurent Pinchart <laurent.pinchart+renesas@...asonboard.com>
> Cc: Al Viro <viro@...iv.linux.org.uk>
> Cc: Ma Ke <make24@...as.ac.cn>
> Cc: Jai Luthra <jai.luthra@...asonboard.com>
> Cc: linux-media@...r.kernel.org
> Cc: linux-kernel@...r.kernel.org
> ---
>  drivers/media/v4l2-core/v4l2-dev.c | 27 +++++++++++++++++++++++++
>  include/media/v4l2-dev.h           | 40 ++++++++++++++++++++++++++++++++++++++
>  2 files changed, 67 insertions(+)
> 
> diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c
> index 10a126e50c1ca25b1bd0e9872571261acfc26b39..997255709448510fcd17b6de798a3df99cd7ea09 100644
> --- a/drivers/media/v4l2-core/v4l2-dev.c
> +++ b/drivers/media/v4l2-core/v4l2-dev.c
> @@ -163,6 +163,27 @@ void video_device_release_empty(struct video_device *vdev)
>  }
>  EXPORT_SYMBOL(video_device_release_empty);
>  
> +struct video_device_state *
> +__video_device_state_alloc(struct video_device *vdev)
> +{
> +	struct video_device_state *state =
> +		kzalloc(sizeof(struct video_device_state), GFP_KERNEL);
> +
> +	if (!state)
> +		return ERR_PTR(-ENOMEM);
> +
> +	state->vdev = vdev;
> +
> +	return state;
> +}
> +EXPORT_SYMBOL_GPL(__video_device_state_alloc);
> +
> +void __video_device_state_free(struct video_device_state *state)
> +{
> +	kfree(state);
> +}
> +EXPORT_SYMBOL_GPL(__video_device_state_free);
> +
>  static inline void video_get(struct video_device *vdev)
>  {
>  	get_device(&vdev->dev);
> @@ -939,6 +960,10 @@ int __video_register_device(struct video_device *vdev,
>  	spin_lock_init(&vdev->fh_lock);
>  	INIT_LIST_HEAD(&vdev->fh_list);
>  
> +	/* state support */
> +	if (test_bit(V4L2_FL_USES_STATE, &vdev->flags))
> +		vdev->state = __video_device_state_alloc(vdev);
> +
>  	/* Part 1: check device type */
>  	switch (type) {
>  	case VFL_TYPE_VIDEO:
> @@ -1127,6 +1152,8 @@ void video_unregister_device(struct video_device *vdev)
>  	clear_bit(V4L2_FL_REGISTERED, &vdev->flags);
>  	mutex_unlock(&videodev_lock);
>  	v4l2_event_wake_all(vdev);
> +	if (test_bit(V4L2_FL_USES_STATE, &vdev->flags))
> +		__video_device_state_free(vdev->state);
>  	device_unregister(&vdev->dev);
>  }
>  EXPORT_SYMBOL(video_unregister_device);
> diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h
> index a213c3398dcf60be8c531df87bf40c56b4ad772d..57e4691ef467aa2b0782dd4b8357bd0670643293 100644
> --- a/include/media/v4l2-dev.h
> +++ b/include/media/v4l2-dev.h
> @@ -89,12 +89,18 @@ struct dentry;
>   *	set by the core when the sub-devices device nodes are registered with
>   *	v4l2_device_register_ro_subdev_nodes() and used by the sub-device ioctl
>   *	handler to restrict access to some ioctl calls.
> + * @V4L2_FL_USES_STATE:
> + *	indicates that the &struct video_device has state support.
> + *	The active video and metadata formats are stored in video_device.state,
> + *	and the try video and metadata formats are stored in v4l2_fh.state.
> + *	All new drivers should use it.
>   */
>  enum v4l2_video_device_flags {
>  	V4L2_FL_REGISTERED		= 0,
>  	V4L2_FL_USES_V4L2_FH		= 1,
>  	V4L2_FL_QUIRK_INVERTED_CROP	= 2,
>  	V4L2_FL_SUBDEV_RO_DEVNODE	= 3,
> +	V4L2_FL_USES_STATE		= 4,
>  };
>  
>  /* Priority helper functions */
> @@ -214,6 +220,17 @@ struct v4l2_file_operations {
>  	int (*release) (struct file *);
>  };
>  
> +/**
> + * struct video_device_state - Used for storing video device state information.
> + *
> + * @fmt: Format of the capture stream
> + * @vdev: Pointer to video device
> + */
> +struct video_device_state {
> +	struct v4l2_format fmt;

While typically a video_device supports only a single video format type, that is
not always the case. There are the following exceptions:

1) M2M devices have both a capture and output video format. However, for M2M devices
   the state is per-filehandle, so it shouldn't be stored in a video_device_state
   struct anyway.
2) VBI devices can have both a raw and sliced VBI format (either capture or output)
3) AFAIK non-M2M video devices can have both a video and meta format. That may have
   changed, I'm not 100% certain about this.
4) video devices can also support an OVERLAY or OUTPUT_OVERLAY format (rare)

V4L2_CAP_VIDEO_OVERLAY is currently only used in
drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c, so once that driver
disappears we can drop video overlay support for capture devices.

2-4 are all quite rare, but 1 is very common. But for such devices the state
wouldn't be in video_device anyway.

But it would be nice if the same struct can be used in both m2m devices and non-m2m
devices. It's just stored either in struct v4l2_fh or struct video_device. It would
give a lot of opportunities for creating helper functions to make the life for
driver developers easier.

Regards,

	Hans

> +	struct video_device *vdev;
> +};
> +
>  /*
>   * Newer version of video_device, handled by videodev2.c
>   *	This version moves redundant code from video device code to
> @@ -238,6 +255,7 @@ struct v4l2_file_operations {
>   * @queue: &struct vb2_queue associated with this device node. May be NULL.
>   * @prio: pointer to &struct v4l2_prio_state with device's Priority state.
>   *	 If NULL, then v4l2_dev->prio will be used.
> + * @state: &struct video_device_state, holds the active state for the device.
>   * @name: video device name
>   * @vfl_type: V4L device type, as defined by &enum vfl_devnode_type
>   * @vfl_dir: V4L receiver, transmitter or m2m
> @@ -283,6 +301,7 @@ struct video_device {
>  	struct vb2_queue *queue;
>  
>  	struct v4l2_prio_state *prio;
> +	struct video_device_state *state;
>  
>  	/* device info */
>  	char name[64];
> @@ -546,6 +565,27 @@ static inline int video_is_registered(struct video_device *vdev)
>  	return test_bit(V4L2_FL_REGISTERED, &vdev->flags);
>  }
>  
> +/** __video_device_state_alloc - allocate video device state structure
> + *
> + * @vdev: pointer to struct video_device
> + *
> + * .. note::
> + *
> + *	This function is meant to be used only inside the V4L2 core.
> + */
> +struct video_device_state *
> +__video_device_state_alloc(struct video_device *vdev);
> +
> +/** __video_device_state_free - free video device state structure
> + *
> + * @state: pointer to the state to be freed
> + *
> + * .. note::
> + *
> + *	This function is meant to be used only inside the V4L2 core.
> + */
> +void __video_device_state_free(struct video_device_state *state);
> +
>  /**
>   * v4l2_debugfs_root - returns the dentry of the top-level "v4l2" debugfs dir
>   *
> 


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ