From: Peter De Schrijver <pdeschrijver@nvidia.com>
To: Saravana Kannan <skannan@codeaurora.org>
Cc: Andrew Lunn <andrew@lunn.ch>,
Grant Likely <grant.likely@secretlab.ca>,
Jamie Iles <jamie@jamieiles.com>,
Jeremy Kerr <jeremy.kerr@canonical.com>,
Mike Turquette <mturquette@linaro.org>,
Magnus Damm <magnus.damm@gmail.com>,
Deepak Saxena <dsaxena@linaro.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
Arnd Bergman <arnd.bergmann@linaro.org>,
Stephen Warren <swarren@wwwdotorg.org>,
"linux-arm-msm@vger.kernel.org" <linux-arm-msm@vger.kernel.org>,
Sascha Hauer <s.hauer@pengutronix.de>,
Rob Herring <rob.herring@calxeda.com>,
Russell King <linux@arm.linux.org.uk>,
Thomas Gleixner <tglx@linutronix.de>,
Richard Zhao <richard.zhao@linaro.org>,
Shawn Guo <shawn.guo@freescale.com>,
Paul Walmsley <paul@pwsan.com>,
Linus Walleij <linus.walleij@stericsson.com>,
Mark Brown <broonie@opensource.wolfsonmicro.com>,
Stephen Boyd <sboyd@codeaurora.org>
Subject: Re: [PATCH] clk: Fix race conditions between clk_set_parent() and clk_enable()
Date: Tue, 22 May 2012 16:58:13 +0300 [thread overview]
Message-ID: <20120522135813.GL8730@tbergstrom-lnx.Nvidia.com> (raw)
In-Reply-To: <4FB29E7C.7010606@codeaurora.org>
On Tue, May 15, 2012 at 08:20:44PM +0200, Saravana Kannan wrote:
> On 05/11/2012 09:59 PM, Saravana Kannan wrote:
> > Without this patch, the following race conditions are possible.
> >
> > Race condition 1:
> > * clk-A has two parents - clk-X and clk-Y.
> > * All three are disabled and clk-X is current parent.
> > * Thread A: clk_set_parent(clk-A, clk-Y).
> > * Thread A:<snip execution flow>
> > * Thread A: Grabs enable lock.
> > * Thread A: Sees enable count of clk-A is 0, so doesn't enable clk-Y.
> > * Thread A: Releases enable lock.
> > * Thread B: Calls clk_enable(clk-A), which in turn enables clk-X.
> > * Thread A: Switches clk-A's parent to clk-Y in hardware.
> >
> > clk-A is now enabled in software, but not clocking in hardware.
> >
> > Race condition 2:
> > * clk-A has two parents - clk-X and clk-Y.
> > * All three are disabled and clk-X is current parent.
> > * Thread A: clk_set_parent(clk-A, clk-Y).
> > * Thread A:<snip execution flow>
> > * Thread A: Switches parent in hardware to clk-Y.
> > * Thread A: Grabs enable lock.
> > * Thread A: Sees enable count of clk-A is 0, so doesn't disable clk-X.
> > * Thread A: Releases enable lock.
> > * Thread B: Calls clk_enable(clk-A)
> > * Thread B: Software state still says parent is clk-X.
> > * Thread B: So, enables clk-X and then itself.
> > * Thread A: Updates parent in software state to clk-Y.
> >
This looks correct to me. Is there any usecase where enabling/disabling a
clock would require sleeping but changing the parent would not?
Cheers,
Peter.
WARNING: multiple messages have this Message-ID (diff)
From: pdeschrijver@nvidia.com (Peter De Schrijver)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] clk: Fix race conditions between clk_set_parent() and clk_enable()
Date: Tue, 22 May 2012 16:58:13 +0300 [thread overview]
Message-ID: <20120522135813.GL8730@tbergstrom-lnx.Nvidia.com> (raw)
In-Reply-To: <4FB29E7C.7010606@codeaurora.org>
On Tue, May 15, 2012 at 08:20:44PM +0200, Saravana Kannan wrote:
> On 05/11/2012 09:59 PM, Saravana Kannan wrote:
> > Without this patch, the following race conditions are possible.
> >
> > Race condition 1:
> > * clk-A has two parents - clk-X and clk-Y.
> > * All three are disabled and clk-X is current parent.
> > * Thread A: clk_set_parent(clk-A, clk-Y).
> > * Thread A:<snip execution flow>
> > * Thread A: Grabs enable lock.
> > * Thread A: Sees enable count of clk-A is 0, so doesn't enable clk-Y.
> > * Thread A: Releases enable lock.
> > * Thread B: Calls clk_enable(clk-A), which in turn enables clk-X.
> > * Thread A: Switches clk-A's parent to clk-Y in hardware.
> >
> > clk-A is now enabled in software, but not clocking in hardware.
> >
> > Race condition 2:
> > * clk-A has two parents - clk-X and clk-Y.
> > * All three are disabled and clk-X is current parent.
> > * Thread A: clk_set_parent(clk-A, clk-Y).
> > * Thread A:<snip execution flow>
> > * Thread A: Switches parent in hardware to clk-Y.
> > * Thread A: Grabs enable lock.
> > * Thread A: Sees enable count of clk-A is 0, so doesn't disable clk-X.
> > * Thread A: Releases enable lock.
> > * Thread B: Calls clk_enable(clk-A)
> > * Thread B: Software state still says parent is clk-X.
> > * Thread B: So, enables clk-X and then itself.
> > * Thread A: Updates parent in software state to clk-Y.
> >
This looks correct to me. Is there any usecase where enabling/disabling a
clock would require sleeping but changing the parent would not?
Cheers,
Peter.
WARNING: multiple messages have this Message-ID (diff)
From: Peter De Schrijver <pdeschrijver@nvidia.com>
To: Saravana Kannan <skannan@codeaurora.org>
Cc: Mike Turquette <mturquette@linaro.org>,
Arnd Bergman <arnd.bergmann@linaro.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
Paul Walmsley <paul@pwsan.com>,
Sascha Hauer <s.hauer@pengutronix.de>,
Mark Brown <broonie@opensource.wolfsonmicro.com>,
Shawn Guo <shawn.guo@freescale.com>,
Stephen Warren <swarren@wwwdotorg.org>,
Andrew Lunn <andrew@lunn.ch>,
Russell King <linux@arm.linux.org.uk>,
Linus Walleij <linus.walleij@stericsson.com>,
Stephen Boyd <sboyd@codeaurora.org>,
"linux-arm-msm@vger.kernel.org" <linux-arm-msm@vger.kernel.org>,
Magnus Damm <magnus.damm@gmail.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Rob Herring <rob.herring@calxeda.com>,
Richard Zhao <richard.zhao@linaro.org>,
Grant Likely <grant.likely@secretlab.ca>,
Deepak Saxena <dsaxena@linaro.org>,
Amit Kucheria <amit.kucheria@linaro.org>,
Jamie Iles <jamie@jamieiles.com>,
Jeremy Kerr <jeremy.kerr@canonical.com>,
Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH] clk: Fix race conditions between clk_set_parent() and clk_enable()
Date: Tue, 22 May 2012 16:58:13 +0300 [thread overview]
Message-ID: <20120522135813.GL8730@tbergstrom-lnx.Nvidia.com> (raw)
In-Reply-To: <4FB29E7C.7010606@codeaurora.org>
On Tue, May 15, 2012 at 08:20:44PM +0200, Saravana Kannan wrote:
> On 05/11/2012 09:59 PM, Saravana Kannan wrote:
> > Without this patch, the following race conditions are possible.
> >
> > Race condition 1:
> > * clk-A has two parents - clk-X and clk-Y.
> > * All three are disabled and clk-X is current parent.
> > * Thread A: clk_set_parent(clk-A, clk-Y).
> > * Thread A:<snip execution flow>
> > * Thread A: Grabs enable lock.
> > * Thread A: Sees enable count of clk-A is 0, so doesn't enable clk-Y.
> > * Thread A: Releases enable lock.
> > * Thread B: Calls clk_enable(clk-A), which in turn enables clk-X.
> > * Thread A: Switches clk-A's parent to clk-Y in hardware.
> >
> > clk-A is now enabled in software, but not clocking in hardware.
> >
> > Race condition 2:
> > * clk-A has two parents - clk-X and clk-Y.
> > * All three are disabled and clk-X is current parent.
> > * Thread A: clk_set_parent(clk-A, clk-Y).
> > * Thread A:<snip execution flow>
> > * Thread A: Switches parent in hardware to clk-Y.
> > * Thread A: Grabs enable lock.
> > * Thread A: Sees enable count of clk-A is 0, so doesn't disable clk-X.
> > * Thread A: Releases enable lock.
> > * Thread B: Calls clk_enable(clk-A)
> > * Thread B: Software state still says parent is clk-X.
> > * Thread B: So, enables clk-X and then itself.
> > * Thread A: Updates parent in software state to clk-Y.
> >
This looks correct to me. Is there any usecase where enabling/disabling a
clock would require sleeping but changing the parent would not?
Cheers,
Peter.
next prev parent reply other threads:[~2012-05-22 13:58 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-12 4:59 [PATCH] clk: Fix race conditions between clk_set_parent() and clk_enable() Saravana Kannan
2012-05-12 4:59 ` Saravana Kannan
2012-05-15 18:20 ` Saravana Kannan
2012-05-15 18:20 ` Saravana Kannan
2012-05-22 13:58 ` Peter De Schrijver [this message]
2012-05-22 13:58 ` Peter De Schrijver
2012-05-22 13:58 ` Peter De Schrijver
2012-05-22 18:06 ` Turquette, Mike
2012-05-22 18:06 ` Turquette, Mike
2012-05-22 18:06 ` Turquette, Mike
2012-05-23 9:16 ` Peter De Schrijver
2012-05-23 9:16 ` Peter De Schrijver
2012-05-23 9:16 ` Peter De Schrijver
2012-05-31 3:46 ` Saravana Kannan
2012-05-31 3:46 ` Saravana Kannan
2012-05-31 3:46 ` Saravana Kannan
2012-05-15 19:42 ` Sascha Hauer
2012-05-15 19:42 ` Sascha Hauer
2012-05-15 19:42 ` Sascha Hauer
2012-05-15 19:51 ` Saravana Kannan
2012-05-15 19:51 ` Saravana Kannan
2012-05-15 20:00 ` Sascha Hauer
2012-05-15 20:00 ` Sascha Hauer
2012-05-15 20:00 ` Sascha Hauer
2012-05-15 20:09 ` Saravana Kannan
2012-05-15 20:09 ` Saravana Kannan
2012-05-16 5:59 ` Turquette, Mike
2012-05-16 5:59 ` Turquette, Mike
2012-05-16 9:19 ` skannan
2012-05-16 9:19 ` skannan
2012-05-16 9:19 ` skannan at codeaurora.org
2012-05-15 20:43 ` [PATCH] clk: Fix CLK_SET_RATE_GATE flag validation in clk_set_rate() Saravana Kannan
2012-05-15 20:43 ` Saravana Kannan
2012-05-15 22:31 ` Richard Zhao
2012-05-15 22:31 ` Richard Zhao
2012-05-16 0:25 ` Richard Zhao
2012-05-16 0:25 ` Richard Zhao
2012-05-16 0:25 ` Richard Zhao
2012-05-16 5:40 ` Turquette, Mike
2012-05-16 5:40 ` Turquette, Mike
2012-05-16 6:00 ` [PATCH] clk: Fix race conditions between clk_set_parent() and clk_enable() Turquette, Mike
2012-05-16 6:00 ` Turquette, Mike
2012-05-16 7:30 ` Linus Walleij
2012-05-16 7:30 ` Linus Walleij
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=20120522135813.GL8730@tbergstrom-lnx.Nvidia.com \
--to=pdeschrijver@nvidia.com \
--cc=andrew@lunn.ch \
--cc=arnd.bergmann@linaro.org \
--cc=broonie@opensource.wolfsonmicro.com \
--cc=dsaxena@linaro.org \
--cc=grant.likely@secretlab.ca \
--cc=jamie@jamieiles.com \
--cc=jeremy.kerr@canonical.com \
--cc=linus.walleij@stericsson.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=magnus.damm@gmail.com \
--cc=mturquette@linaro.org \
--cc=paul@pwsan.com \
--cc=richard.zhao@linaro.org \
--cc=rob.herring@calxeda.com \
--cc=s.hauer@pengutronix.de \
--cc=sboyd@codeaurora.org \
--cc=shawn.guo@freescale.com \
--cc=skannan@codeaurora.org \
--cc=swarren@wwwdotorg.org \
--cc=tglx@linutronix.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 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.