From: Takashi Iwai <tiwai@suse.de>
To: Shreyas NC <shreyas.nc@intel.com>
Cc: alsa-devel@alsa-project.org, patches.audio@intel.com,
gregkh@linuxfoundation.org, pierre-louis.bossart@linux.intel.com,
vkoul@kernel.org, sanyog.r.kale@intel.com
Subject: Re: [PATCH v4 3/7] soundwire: Add support to lock across bus instances
Date: Mon, 25 Jun 2018 14:38:14 +0200 [thread overview]
Message-ID: <s5hy3f3yrbd.wl-tiwai@suse.de> (raw)
In-Reply-To: <1529924340-30065-4-git-send-email-shreyas.nc@intel.com>
On Mon, 25 Jun 2018 12:58:56 +0200,
Shreyas NC wrote:
>
> From: Sanyog Kale <sanyog.r.kale@intel.com>
>
> Currently, the stream concept is limited to single Master and one
> or more Codecs.
>
> This patch extends the concept to support multiple Master(s)
> sharing the same reference clock and synchronized in the hardware.
> Modify sdw_stream_runtime to support a list of sdw_master_runtime
> for the same. The existing reference to a single m_rt is removed
> in the next patch.
>
> Typically to lock, one would acquire a global lock and then lock
> bus instances. In this case, the caller framework(ASoC DPCM)
> guarantees that stream operations on a card are always serialized.
> So, there is no race condition and hence no need for global lock.
>
> Bus lock(s) are acquired to reconfigure the bus while the stream
> is set-up.
> So, we add sdw_acquire_bus_lock()/sdw_release_bus_lock() APIs which
> are used only to reconfigure the bus.
>
> Signed-off-by: Sanyog Kale <sanyog.r.kale@intel.com>
> Signed-off-by: Vinod Koul <vkoul@kernel.org>
> Signed-off-by: Shreyas NC <shreyas.nc@intel.com>
> ---
> drivers/soundwire/bus.h | 2 ++
> drivers/soundwire/stream.c | 41 +++++++++++++++++++++++++++++++++++++++++
> include/linux/soundwire/sdw.h | 4 ++++
> 3 files changed, 47 insertions(+)
>
> diff --git a/drivers/soundwire/bus.h b/drivers/soundwire/bus.h
> index 3b15c4e..b6cfbdf 100644
> --- a/drivers/soundwire/bus.h
> +++ b/drivers/soundwire/bus.h
> @@ -99,6 +99,7 @@ struct sdw_slave_runtime {
> * this stream, can be zero.
> * @slave_rt_list: Slave runtime list
> * @port_list: List of Master Ports configured for this stream, can be zero.
> + * @stream_node: sdw_stream_runtime master_list node
> * @bus_node: sdw_bus m_rt_list node
> */
> struct sdw_master_runtime {
> @@ -108,6 +109,7 @@ struct sdw_master_runtime {
> unsigned int ch_count;
> struct list_head slave_rt_list;
> struct list_head port_list;
> + struct list_head stream_node;
> struct list_head bus_node;
> };
>
> diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c
> index 8974a0f..eb942c6 100644
> --- a/drivers/soundwire/stream.c
> +++ b/drivers/soundwire/stream.c
> @@ -747,6 +747,7 @@ struct sdw_stream_runtime *sdw_alloc_stream(char *stream_name)
> return NULL;
>
> stream->name = stream_name;
> + INIT_LIST_HEAD(&stream->master_list);
> stream->state = SDW_STREAM_ALLOCATED;
>
> return stream;
> @@ -1234,6 +1235,46 @@ struct sdw_dpn_prop *sdw_get_slave_dpn_prop(struct sdw_slave *slave,
> return NULL;
> }
>
> +/**
> + * sdw_acquire_bus_lock: Acquire bus lock for all Master runtime(s)
> + *
> + * @stream: SoundWire stream
> + *
> + * Acquire bus_lock for each of the master runtime(m_rt) part of this
> + * stream to reconfigure the bus.
> + */
> +static void sdw_acquire_bus_lock(struct sdw_stream_runtime *stream)
> +{
> + struct sdw_master_runtime *m_rt = NULL;
> + struct sdw_bus *bus = NULL;
> +
> + /* Iterate for all Master(s) in Master list */
> + list_for_each_entry(m_rt, &stream->master_list, stream_node) {
> + bus = m_rt->bus;
> +
> + mutex_lock(&bus->bus_lock);
> + }
> +}
So it's nested locks? Then you'd need some more trick to deal with
the lockdep. I guess you'll get the false-positive deadlock detection
by this code when the mutex lock debug is enabled.
Also, is the linked order assured not to lead to a real deadlock?
> +/**
> + * sdw_release_bus_lock: Release bus lock for all Master runtime(s)
> + *
> + * @stream: SoundWire stream
> + *
> + * Release the previously held bus_lock after reconfiguring the bus.
> + */
> +static void sdw_release_bus_lock(struct sdw_stream_runtime *stream)
> +{
> + struct sdw_master_runtime *m_rt = NULL;
> + struct sdw_bus *bus = NULL;
> +
> + /* Iterate for all Master(s) in Master list */
> + list_for_each_entry(m_rt, &stream->master_list, stream_node) {
> + bus = m_rt->bus;
> + mutex_unlock(&bus->bus_lock);
> + }
... and this looks bad. The loop for unlocking should be traversed
reversely.
thanks,
Takashi
next prev parent reply other threads:[~2018-06-25 12:38 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-25 10:58 [PATCH v4 0/7] soundwire: Add multi link support Shreyas NC
2018-06-25 10:58 ` [PATCH v4 1/7] Documentation: soundwire: Add documentation for multi link Shreyas NC
2018-06-25 10:58 ` [PATCH v4 2/7] soundwire: Initialize completion for defer messages Shreyas NC
2018-06-25 10:58 ` [PATCH v4 3/7] soundwire: Add support to lock across bus instances Shreyas NC
2018-06-25 12:38 ` Takashi Iwai [this message]
2018-06-26 8:22 ` Shreyas NC
2018-06-26 8:34 ` Takashi Iwai
2018-06-26 9:23 ` Shreyas NC
2018-06-26 9:46 ` Takashi Iwai
2018-06-26 9:59 ` Shreyas NC
2018-06-26 10:16 ` Takashi Iwai
2018-06-26 10:22 ` Shreyas NC
2018-06-26 10:38 ` Takashi Iwai
2018-06-25 10:58 ` [PATCH v4 4/7] soundwire: Handle multiple master instances in a stream Shreyas NC
2018-07-02 20:22 ` Pierre-Louis Bossart
2018-07-03 1:13 ` Shreyas NC
2018-07-03 15:03 ` Pierre-Louis Bossart
2018-07-03 16:03 ` Nc, Shreyas
2018-07-03 18:59 ` Pierre-Louis Bossart
2018-07-04 0:17 ` Nc, Shreyas
2018-07-04 4:24 ` Vinod
2018-06-25 10:58 ` [PATCH v4 5/7] soundwire: keep track of Masters " Shreyas NC
2018-06-25 10:58 ` [PATCH v4 6/7] soundwire: Add support for multi link bank switch Shreyas NC
2018-06-25 10:59 ` [PATCH v4 7/7] soundwire: intel: Add pre/post bank switch ops Shreyas NC
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=s5hy3f3yrbd.wl-tiwai@suse.de \
--to=tiwai@suse.de \
--cc=alsa-devel@alsa-project.org \
--cc=gregkh@linuxfoundation.org \
--cc=patches.audio@intel.com \
--cc=pierre-louis.bossart@linux.intel.com \
--cc=sanyog.r.kale@intel.com \
--cc=shreyas.nc@intel.com \
--cc=vkoul@kernel.org \
/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.