From: Nishanth Menon <nm@ti.com>
To: Dmitry Torokhov <dtor@chromium.org>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
Viresh Kumar <viresh.kumar@linaro.org>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>,
Geert Uytterhoeven <geert+renesas@glider.be>,
Stefan Wahren <stefan.wahren@i2se.com>,
Paul Gortmaker <paul.gortmaker@windriver.com>,
linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/4] PM / OPP: add some lockdep annotations
Date: Wed, 24 Dec 2014 10:28:42 -0600 [thread overview]
Message-ID: <549AE9BA.2050308@ti.com> (raw)
In-Reply-To: <1418771379-24369-2-git-send-email-dtor@chromium.org>
On 12/16/2014 05:09 PM, Dmitry Torokhov wrote:
> Certain OPP APIs need to be called under RCU lock; let's add a few
> rcu_lockdep_assert() calls to warn about potential misuse.
>
> Signed-off-by: Dmitry Torokhov <dtor@chromium.org>
> ---
> drivers/base/power/opp.c | 16 ++++++++++++++++
> 1 file changed, 16 insertions(+)
>
> diff --git a/drivers/base/power/opp.c b/drivers/base/power/opp.c
> index d24dd614a..b78c14d 100644
> --- a/drivers/base/power/opp.c
> +++ b/drivers/base/power/opp.c
> @@ -108,6 +108,14 @@ static LIST_HEAD(dev_opp_list);
> /* Lock to allow exclusive modification to the device and opp lists */
> static DEFINE_MUTEX(dev_opp_list_lock);
>
> +#define opp_rcu_lockdep_assert() \
> +do { \
> + rcu_lockdep_assert(rcu_read_lock_held() || \
> + lockdep_is_held(&dev_opp_list_lock), \
> + "Missing rcu_read_lock() or " \
> + "dev_opp_list_lock protection"); \
> +} while (0)
> +
> /**
> * find_device_opp() - find device_opp struct using device pointer
> * @dev: device pointer used to lookup device OPPs
> @@ -218,6 +226,8 @@ int dev_pm_opp_get_opp_count(struct device *dev)
> struct dev_pm_opp *temp_opp;
> int count = 0;
>
> + opp_rcu_lockdep_assert();
> +
> dev_opp = find_device_opp(dev);
> if (IS_ERR(dev_opp)) {
> int r = PTR_ERR(dev_opp);
> @@ -267,6 +277,8 @@ struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
> struct device_opp *dev_opp;
> struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
>
> + opp_rcu_lockdep_assert();
> +
> dev_opp = find_device_opp(dev);
> if (IS_ERR(dev_opp)) {
> int r = PTR_ERR(dev_opp);
> @@ -313,6 +325,8 @@ struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
> struct device_opp *dev_opp;
> struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
>
> + opp_rcu_lockdep_assert();
> +
> if (!dev || !freq) {
> dev_err(dev, "%s: Invalid argument freq=%p\n", __func__, freq);
> return ERR_PTR(-EINVAL);
> @@ -361,6 +375,8 @@ struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
> struct device_opp *dev_opp;
> struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
>
> + opp_rcu_lockdep_assert();
> +
> if (!dev || !freq) {
> dev_err(dev, "%s: Invalid argument freq=%p\n", __func__, freq);
> return ERR_PTR(-EINVAL);
>
You should also add opp_rcu_lockdep_assert to the following functions:
dev_pm_opp_get_voltage and dev_pm_opp_get_freq - both of which must be
used under rcu read lock.
dev_pm_opp_get_notifier references the RCU protected dev_opp list ->
so that must also be under rcu read lock.
love the concept, and I suggest splitting this into the following:
RCU readers: trivial as rcu_read_lock_help dumps
RCU updates: (adding, updating, removing): for the helper functions
ensure mutex_lock held assertion.
--
Regards,
Nishanth Menon
WARNING: multiple messages have this Message-ID (diff)
From: Nishanth Menon <nm@ti.com>
To: Dmitry Torokhov <dtor@chromium.org>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
Viresh Kumar <viresh.kumar@linaro.org>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>,
Geert Uytterhoeven <geert+renesas@glider.be>,
Stefan Wahren <stefan.wahren@i2se.com>,
Paul Gortmaker <paul.gortmaker@windriver.com>,
<linux-pm@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 1/4] PM / OPP: add some lockdep annotations
Date: Wed, 24 Dec 2014 10:28:42 -0600 [thread overview]
Message-ID: <549AE9BA.2050308@ti.com> (raw)
In-Reply-To: <1418771379-24369-2-git-send-email-dtor@chromium.org>
On 12/16/2014 05:09 PM, Dmitry Torokhov wrote:
> Certain OPP APIs need to be called under RCU lock; let's add a few
> rcu_lockdep_assert() calls to warn about potential misuse.
>
> Signed-off-by: Dmitry Torokhov <dtor@chromium.org>
> ---
> drivers/base/power/opp.c | 16 ++++++++++++++++
> 1 file changed, 16 insertions(+)
>
> diff --git a/drivers/base/power/opp.c b/drivers/base/power/opp.c
> index d24dd614a..b78c14d 100644
> --- a/drivers/base/power/opp.c
> +++ b/drivers/base/power/opp.c
> @@ -108,6 +108,14 @@ static LIST_HEAD(dev_opp_list);
> /* Lock to allow exclusive modification to the device and opp lists */
> static DEFINE_MUTEX(dev_opp_list_lock);
>
> +#define opp_rcu_lockdep_assert() \
> +do { \
> + rcu_lockdep_assert(rcu_read_lock_held() || \
> + lockdep_is_held(&dev_opp_list_lock), \
> + "Missing rcu_read_lock() or " \
> + "dev_opp_list_lock protection"); \
> +} while (0)
> +
> /**
> * find_device_opp() - find device_opp struct using device pointer
> * @dev: device pointer used to lookup device OPPs
> @@ -218,6 +226,8 @@ int dev_pm_opp_get_opp_count(struct device *dev)
> struct dev_pm_opp *temp_opp;
> int count = 0;
>
> + opp_rcu_lockdep_assert();
> +
> dev_opp = find_device_opp(dev);
> if (IS_ERR(dev_opp)) {
> int r = PTR_ERR(dev_opp);
> @@ -267,6 +277,8 @@ struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
> struct device_opp *dev_opp;
> struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
>
> + opp_rcu_lockdep_assert();
> +
> dev_opp = find_device_opp(dev);
> if (IS_ERR(dev_opp)) {
> int r = PTR_ERR(dev_opp);
> @@ -313,6 +325,8 @@ struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
> struct device_opp *dev_opp;
> struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
>
> + opp_rcu_lockdep_assert();
> +
> if (!dev || !freq) {
> dev_err(dev, "%s: Invalid argument freq=%p\n", __func__, freq);
> return ERR_PTR(-EINVAL);
> @@ -361,6 +375,8 @@ struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
> struct device_opp *dev_opp;
> struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
>
> + opp_rcu_lockdep_assert();
> +
> if (!dev || !freq) {
> dev_err(dev, "%s: Invalid argument freq=%p\n", __func__, freq);
> return ERR_PTR(-EINVAL);
>
You should also add opp_rcu_lockdep_assert to the following functions:
dev_pm_opp_get_voltage and dev_pm_opp_get_freq - both of which must be
used under rcu read lock.
dev_pm_opp_get_notifier references the RCU protected dev_opp list ->
so that must also be under rcu read lock.
love the concept, and I suggest splitting this into the following:
RCU readers: trivial as rcu_read_lock_help dumps
RCU updates: (adding, updating, removing): for the helper functions
ensure mutex_lock held assertion.
--
Regards,
Nishanth Menon
next prev parent reply other threads:[~2014-12-24 16:28 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-16 23:09 [PATCH 0/4] Allow cpufreq-dt to defer probe if OPP table is not ready Dmitry Torokhov
2014-12-16 23:09 ` [PATCH 1/4] PM / OPP: add some lockdep annotations Dmitry Torokhov
2014-12-17 4:10 ` Viresh Kumar
2014-12-24 16:28 ` Nishanth Menon [this message]
2014-12-24 16:28 ` Nishanth Menon
2014-12-16 23:09 ` [PATCH 2/4] PM / OPP: fix warning in of_free_opp_table Dmitry Torokhov
2014-12-17 4:28 ` Viresh Kumar
2014-12-24 16:42 ` Nishanth Menon
2014-12-16 23:09 ` [PATCH 3/4] PM / OPP: take RCU lock in dev_pm_opp_get_opp_count Dmitry Torokhov
2014-12-17 4:36 ` Viresh Kumar
2014-12-17 17:28 ` Dmitry Torokhov
2014-12-18 2:11 ` Viresh Kumar
2014-12-17 23:47 ` Paul E. McKenney
2014-12-18 2:11 ` Viresh Kumar
2014-12-24 16:48 ` Nishanth Menon
2014-12-24 16:48 ` Nishanth Menon
2014-12-24 17:09 ` Dmitry Torokhov
2014-12-24 17:16 ` Nishanth Menon
2014-12-24 17:31 ` Dmitry Torokhov
2014-12-24 17:37 ` Nishanth Menon
2014-12-24 17:44 ` Dmitry Torokhov
2014-12-24 20:37 ` Nishanth Menon
2014-12-27 20:34 ` Rafael J. Wysocki
2014-12-16 23:09 ` [PATCH 4/4] cpufreq-dt: defer probing if OPP table is not ready Dmitry Torokhov
2014-12-17 4:37 ` Viresh Kumar
2014-12-24 16:58 ` Nishanth Menon
2014-12-17 4:42 ` [PATCH 0/4] Allow cpufreq-dt to defer probe " Viresh Kumar
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=549AE9BA.2050308@ti.com \
--to=nm@ti.com \
--cc=dtor@chromium.org \
--cc=geert+renesas@glider.be \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=paul.gortmaker@windriver.com \
--cc=rjw@rjwysocki.net \
--cc=stefan.wahren@i2se.com \
--cc=thomas.petazzoni@free-electrons.com \
--cc=viresh.kumar@linaro.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.