From: Hans Verkuil <hverkuil@xs4all.nl>
To: Sakari Ailus <sakari.ailus@linux.intel.com>, linux-media@vger.kernel.org
Subject: Re: [PATCH 2/6] v4l: subdev: Provide a locking scheme for subdev operations
Date: Thu, 12 Sep 2019 15:11:27 +0200 [thread overview]
Message-ID: <cec240cb-daf7-fc68-6578-44be011720ba@xs4all.nl> (raw)
In-Reply-To: <20190819124728.10511-3-sakari.ailus@linux.intel.com>
On 8/19/19 2:47 PM, Sakari Ailus wrote:
> The V4L2 sub-device's operations are called both from other drivers as
> well as through the IOCTL uAPI. Previously the sub-device drivers were
> responsible for managing their own serialisation. This patch adds an
> optional mutex the drivers may set, and it will be used to serialise
> access to driver's data related to a device across the driver's ops.
>
> Access to the driver's controls through the control framework works as
> usual, i.e. using a different mutex.
>
> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> ---
> include/media/v4l2-subdev.h | 25 +++++++++++++++++--------
> 1 file changed, 17 insertions(+), 8 deletions(-)
>
> diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
> index 71f1f2f0da53..dc6e11019df6 100644
> --- a/include/media/v4l2-subdev.h
> +++ b/include/media/v4l2-subdev.h
> @@ -9,6 +9,7 @@
> #define _V4L2_SUBDEV_H
>
> #include <linux/types.h>
> +#include <linux/mutex.h>
> #include <linux/v4l2-subdev.h>
> #include <media/media-entity.h>
> #include <media/v4l2-async.h>
> @@ -828,6 +829,7 @@ struct v4l2_subdev_platform_data {
> * @host_priv: pointer to private data used by the device where the subdev
> * is attached.
> * @devnode: subdev device node
> + * @lock: A mutex for serialising access to the subdev's operations. Optional.
A pointer to a mutex...
> * @dev: pointer to the physical device, if any
> * @fwnode: The fwnode_handle of the subdev, usually the same as
> * either dev->of_node->fwnode or dev->fwnode (whichever is non-NULL).
> @@ -862,6 +864,7 @@ struct v4l2_subdev {
> void *dev_priv;
> void *host_priv;
> struct video_device *devnode;
> + struct mutex *lock;
> struct device *dev;
> struct fwnode_handle *fwnode;
> struct list_head async_list;
> @@ -1101,16 +1104,22 @@ extern const struct v4l2_subdev_ops v4l2_subdev_call_wrappers;
> ({ \
> struct v4l2_subdev *__sd = (sd); \
> int __result; \
> - if (!__sd) \
> + if (!__sd) { \
> __result = -ENODEV; \
> - else if (!(__sd->ops->o && __sd->ops->o->f)) \
> + } else if (!(__sd->ops->o && __sd->ops->o->f)) { \
> __result = -ENOIOCTLCMD; \
> - else if (v4l2_subdev_call_wrappers.o && \
> - v4l2_subdev_call_wrappers.o->f) \
> - __result = v4l2_subdev_call_wrappers.o->f( \
> - __sd, ##args); \
> - else \
> - __result = __sd->ops->o->f(__sd, ##args); \
> + } else { \
> + if (__sd->lock) \
> + mutex_lock(__sd->lock); \
> + if (v4l2_subdev_call_wrappers.o && \
> + v4l2_subdev_call_wrappers.o->f) \
> + __result = v4l2_subdev_call_wrappers.o->f( \
> + __sd, ##args); \
> + else \
> + __result = __sd->ops->o->f(__sd, ##args); \
> + if (__sd->lock) \
> + mutex_unlock(__sd->lock); \
> + } \
> __result; \
> })
>
>
I'm not sure this is the right place to lock. Locking is only needed if the
subdev device can be called directly from userspace. So I would put the
locking in subdev_do_ioctl() and use mutex_lock_interruptible.
If there are subdev ops that in this scenario (i.e. userspace is responsible
for configuring the subdev) are still called from another driver, then I would
create a v4l2_subdev_call_lock() function that takes the lock.
Adding a lock in the v4l2_subdev_call macro feels too invasive.
Regards,
Hans
next prev parent reply other threads:[~2019-09-12 13:11 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-19 12:47 [PATCH 0/6] Provide a serialisation mechanism for subdev ops Sakari Ailus
2019-08-19 12:47 ` [PATCH 1/6] v4l: subdev: Set sd->devnode before registering the subdev Sakari Ailus
2019-09-12 12:40 ` Hans Verkuil
2019-08-19 12:47 ` [PATCH 2/6] v4l: subdev: Provide a locking scheme for subdev operations Sakari Ailus
2019-09-12 13:11 ` Hans Verkuil [this message]
2019-09-12 13:24 ` Sakari Ailus
2019-08-19 12:47 ` [PATCH 3/6] smiapp: Error handling cleanups and fixes Sakari Ailus
2019-08-19 12:47 ` [PATCH 4/6] smiapp: Rely on V4L2 sub-device framework to do the locking Sakari Ailus
2019-08-19 12:47 ` [PATCH 5/6] smiapp: Remove the active field from sensor's struct Sakari Ailus
2019-08-19 12:47 ` [PATCH 6/6] smiapp: Avoid fall-through in switch Sakari Ailus
2019-09-12 13:17 ` Hans Verkuil
2019-09-13 6:50 ` Sakari Ailus
2019-09-13 6:47 ` [PATCH v2 " Sakari Ailus
2019-09-13 6:52 ` Hans Verkuil
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=cec240cb-daf7-fc68-6578-44be011720ba@xs4all.nl \
--to=hverkuil@xs4all.nl \
--cc=linux-media@vger.kernel.org \
--cc=sakari.ailus@linux.intel.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 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).