From: Philipp Zabel <p.zabel@pengutronix.de>
To: Peter Rosin <peda@axentia.se>
Cc: Jonathan Cameron <jic23@kernel.org>,
linux-kernel@vger.kernel.org,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Wolfram Sang <wsa@the-dreams.de>,
Rob Herring <robh+dt@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Hartmut Knaack <knaack.h@gmx.de>,
Lars-Peter Clausen <lars@metafoo.de>,
Peter Meerwald-Stadler <pmeerw@pmeerw.net>,
Jonathan Corbet <corbet@lwn.net>,
linux-i2c@vger.kernel.org, devicetree@vger.kernel.org,
linux-iio@vger.kernel.org, linux-doc@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
Colin Ian King <colin.king@canonical.com>,
Paul Gortmaker <paul.gortmaker@windriver.com>,
kernel@pengutronix.de
Subject: Re: [PATCH v14 00/11] mux controller abstraction and iio/i2c muxes
Date: Mon, 24 Apr 2017 14:38:01 +0200 [thread overview]
Message-ID: <1493037481.2446.32.camel@pengutronix.de> (raw)
In-Reply-To: <2d978956-d247-917d-4150-a6723917a733@axentia.se>
On Mon, 2017-04-24 at 13:37 +0200, Peter Rosin wrote:
[...]
> Ok, so the difference is probably that the rwsem locking primitive
> don't have any lockdep checking hooked up. Because the rwsem was
> definitely held in the same way in v13 as the mutex is now held in
> v14, so there's no fundamental difference.
>
> So, yes, we can use some kind of refcount scheme to not hold an actual
> mutex for the duration of the mux select/deselect, but that doesn't
> really change anything. Userspace is still locking something, and that
> seems dangerous. How do you make sure that mux_control_deselect is
> called as it should?
My current video_mux link setup implementation looks like this (it is
called from userspace via the MEDIA_IOC_SETUP_LINK ioctl):
----------8<----------
static int video_mux_link_setup(struct media_entity *entity,
const struct media_pad *local,
const struct media_pad *remote, u32 flags)
{
struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(entity);
struct video_mux *video_mux = v4l2_subdev_to_video_mux(sd);
int ret;
/*
* The mux state is determined by the enabled sink pad link.
* Enabling or disabling the source pad link has no effect.
*/
if (!is_sink_pad(video_mux, local->index))
return 0;
dev_dbg(sd->dev, "link setup '%s':%d->'%s':%d[%d]", remote->entity->name,
remote->index, local->entity->name, local->index,
flags & MEDIA_LNK_FL_ENABLED);
if (flags & MEDIA_LNK_FL_ENABLED) {
if (video_mux->active == local->index)
return 0;
if (video_mux->active >= 0)
return -EBUSY;
dev_dbg(sd->dev, "setting %d active\n", local->index);
ret = mux_control_try_select(video_mux->mux, local->index);
if (ret < 0)
return ret;
video_mux->active = local->index;
} else {
if (video_mux->active != local->index)
return 0;
dev_dbg(sd->dev, "going inactive\n");
mux_control_deselect(video_mux->mux);
video_mux->active = -1;
}
return 0;
}
---------->8----------
If a mux state was already selected, this should return -EBUSY, until a
call to disable the active link deselects the mux.
> What I don't like about abandoning the lock is that there is still a
> need to support the multi-consumer case and then you need some way
> of keeping track of waiters. A lock does this, and any attempt to open
> code that will get messy.
>
> What might be better is to support some kind of exclusive mux, i.e. a
> mux that only allows one consumer per mux controller. Then the mux core
> could trust that exclusive consumer to not fuck things up for itself and
> thus have no lock at all for select/deselect for the exclusive case. Or
> perhaps keep a refcount (as you suggested) for the exclusive case so
> that mux_control_try_select still makes sense, because you still want
> that, right?
In the case of an exclusive mux without lock, I don't see any need for a
try_select call.
> The question then becomes how to best tell the mux core that you want
> an exclusive mux. I see two options. Either you declare a mux controller
> as exclusive up front somehow (in the device tree presumably), or you
> add a mux_control_get_exclusive call that makes further calls to
> mux_control_get{,_exclusive} fail with -EBUSY. I think I like the
> latter better, if that can be made to work...
There is a precedent for the latter in the reset controller framework
(reset_control_get_shared and reset_control_get_exclusive variants).
Since this distinction is a matter of usage, and not a hardware property
of the mux/reset controller itself, I'd also prefer that.
regards
Philipp
next prev parent reply other threads:[~2017-04-24 12:38 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-24 8:36 [PATCH v14 00/11] mux controller abstraction and iio/i2c muxes Peter Rosin
2017-04-24 8:36 ` [PATCH v14 02/11] dt-bindings: document devicetree bindings for mux-controllers and gpio-mux Peter Rosin
2017-04-24 8:36 ` [PATCH v14 03/11] mux: minimal mux subsystem Peter Rosin
[not found] ` <1493022995-16917-1-git-send-email-peda-koto5C5qi+TLoDKTGw+V6w@public.gmane.org>
2017-04-24 8:36 ` [PATCH v14 01/11] devres: trivial whitespace fix Peter Rosin
2017-04-24 8:36 ` [PATCH v14 04/11] mux: gpio: add mux controller driver for gpio based multiplexers Peter Rosin
2017-04-24 8:36 ` [PATCH v14 05/11] iio: inkern: api for manipulating ext_info of iio channels Peter Rosin
2017-04-24 8:36 ` [PATCH v14 06/11] dt-bindings: iio: io-channel-mux: document io-channel-mux bindings Peter Rosin
2017-04-24 8:36 ` [PATCH v14 07/11] iio: multiplexer: new iio category and iio-mux driver Peter Rosin
2017-04-24 8:36 ` [PATCH v14 08/11] dt-bindings: i2c: i2c-mux: document general purpose i2c-mux bindings Peter Rosin
2017-04-24 8:36 ` [PATCH v14 09/11] i2c: i2c-mux-gpmux: new driver Peter Rosin
2017-04-24 8:36 ` [PATCH v14 10/11] dt-bindings: mux-adg792a: document devicetree bindings for ADG792A/G mux Peter Rosin
2017-04-24 8:36 ` [PATCH v14 11/11] mux: adg792a: add mux controller driver for ADG792A/G Peter Rosin
2017-04-24 10:52 ` [PATCH v14 00/11] mux controller abstraction and iio/i2c muxes Philipp Zabel
[not found] ` <1493031179.2446.9.camel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2017-04-24 11:37 ` Peter Rosin
2017-04-24 12:38 ` Philipp Zabel [this message]
2017-04-24 14:10 ` Philipp Zabel
[not found] ` <1493043046.2446.37.camel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2017-04-24 14:36 ` Peter Rosin
2017-04-24 14:59 ` Philipp Zabel
[not found] ` <1493045969.2446.47.camel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2017-04-25 14:16 ` Peter Rosin
2017-04-25 14:55 ` Peter Rosin
[not found] ` <e53bbf82-793f-b22f-2e9b-4bd377446351-koto5C5qi+TLoDKTGw+V6w@public.gmane.org>
2017-04-25 16:32 ` Philipp Zabel
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=1493037481.2446.32.camel@pengutronix.de \
--to=p.zabel@pengutronix.de \
--cc=akpm@linux-foundation.org \
--cc=colin.king@canonical.com \
--cc=corbet@lwn.net \
--cc=devicetree@vger.kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=jic23@kernel.org \
--cc=kernel@pengutronix.de \
--cc=knaack.h@gmx.de \
--cc=lars@metafoo.de \
--cc=linux-doc@vger.kernel.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=paul.gortmaker@windriver.com \
--cc=peda@axentia.se \
--cc=pmeerw@pmeerw.net \
--cc=robh+dt@kernel.org \
--cc=wsa@the-dreams.de \
/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).