linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] PM / OPP: Assert RCU lock in exported functions
@ 2015-01-09  8:27 Krzysztof Kozlowski
  2015-01-09  8:27 ` [PATCH 2/2] PM / QoS: Use lockdep asserts to find missing hold of power.lock Krzysztof Kozlowski
  2015-01-30  0:16 ` [PATCH 1/2] PM / OPP: Assert RCU lock in exported functions Rafael J. Wysocki
  0 siblings, 2 replies; 4+ messages in thread
From: Krzysztof Kozlowski @ 2015-01-09  8:27 UTC (permalink / raw)
  To: Rafael J. Wysocki, Len Brown, Pavel Machek, Greg Kroah-Hartman,
	linux-pm, linux-kernel
  Cc: Krzysztof Kozlowski

Add lockdep asserts for holding the RCU lock when calling
dev_pm_opp_get_freq() and dev_pm_opp_get_voltage() to aid in detecting
RCU misuses.

These are called often after dev_pm_opp_find_freq_ceil/exact() which
already asserts for RCU lock. However one could make an error by
releasing lock too early - just after dev_pm_opp_find_freq_ceil().

Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
---
 drivers/base/power/opp.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/base/power/opp.c b/drivers/base/power/opp.c
index 106c69359306..842d31e24eee 100644
--- a/drivers/base/power/opp.c
+++ b/drivers/base/power/opp.c
@@ -169,6 +169,8 @@ unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)
 	struct dev_pm_opp *tmp_opp;
 	unsigned long v = 0;
 
+	opp_rcu_lockdep_assert();
+
 	tmp_opp = rcu_dereference(opp);
 	if (unlikely(IS_ERR_OR_NULL(tmp_opp)) || !tmp_opp->available)
 		pr_err("%s: Invalid parameters\n", __func__);
@@ -199,6 +201,8 @@ unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp)
 	struct dev_pm_opp *tmp_opp;
 	unsigned long f = 0;
 
+	opp_rcu_lockdep_assert();
+
 	tmp_opp = rcu_dereference(opp);
 	if (unlikely(IS_ERR_OR_NULL(tmp_opp)) || !tmp_opp->available)
 		pr_err("%s: Invalid parameters\n", __func__);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] PM / QoS: Use lockdep asserts to find missing hold of power.lock
  2015-01-09  8:27 [PATCH 1/2] PM / OPP: Assert RCU lock in exported functions Krzysztof Kozlowski
@ 2015-01-09  8:27 ` Krzysztof Kozlowski
  2015-01-30  0:18   ` Rafael J. Wysocki
  2015-01-30  0:16 ` [PATCH 1/2] PM / OPP: Assert RCU lock in exported functions Rafael J. Wysocki
  1 sibling, 1 reply; 4+ messages in thread
From: Krzysztof Kozlowski @ 2015-01-09  8:27 UTC (permalink / raw)
  To: Rafael J. Wysocki, Len Brown, Pavel Machek, Greg Kroah-Hartman,
	linux-pm, linux-kernel
  Cc: Krzysztof Kozlowski

Add lockdep asserts for holding the dev->power.lock to non-static
functions which require this. They could be used outside of the file so
asserts may help in detecting locking misuse.

Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
---
 drivers/base/power/qos.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/base/power/qos.c b/drivers/base/power/qos.c
index a8fe4c1a8d07..e56d538d039e 100644
--- a/drivers/base/power/qos.c
+++ b/drivers/base/power/qos.c
@@ -64,6 +64,8 @@ enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev, s32 mask)
 	struct pm_qos_flags *pqf;
 	s32 val;
 
+	lockdep_assert_held(&dev->power.lock);
+
 	if (IS_ERR_OR_NULL(qos))
 		return PM_QOS_FLAGS_UNDEFINED;
 
@@ -104,6 +106,8 @@ EXPORT_SYMBOL_GPL(dev_pm_qos_flags);
  */
 s32 __dev_pm_qos_read_value(struct device *dev)
 {
+	lockdep_assert_held(&dev->power.lock);
+
 	return IS_ERR_OR_NULL(dev->power.qos) ?
 		0 : pm_qos_read_value(&dev->power.qos->resume_latency);
 }
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] PM / OPP: Assert RCU lock in exported functions
  2015-01-09  8:27 [PATCH 1/2] PM / OPP: Assert RCU lock in exported functions Krzysztof Kozlowski
  2015-01-09  8:27 ` [PATCH 2/2] PM / QoS: Use lockdep asserts to find missing hold of power.lock Krzysztof Kozlowski
@ 2015-01-30  0:16 ` Rafael J. Wysocki
  1 sibling, 0 replies; 4+ messages in thread
From: Rafael J. Wysocki @ 2015-01-30  0:16 UTC (permalink / raw)
  To: Krzysztof Kozlowski
  Cc: Len Brown, Pavel Machek, Greg Kroah-Hartman, linux-pm, linux-kernel

On Friday, January 09, 2015 09:27:57 AM Krzysztof Kozlowski wrote:
> Add lockdep asserts for holding the RCU lock when calling
> dev_pm_opp_get_freq() and dev_pm_opp_get_voltage() to aid in detecting
> RCU misuses.
> 
> These are called often after dev_pm_opp_find_freq_ceil/exact() which
> already asserts for RCU lock. However one could make an error by
> releasing lock too early - just after dev_pm_opp_find_freq_ceil().
> 
> Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>

Queued up for 3.20, thanks!

> ---
>  drivers/base/power/opp.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/base/power/opp.c b/drivers/base/power/opp.c
> index 106c69359306..842d31e24eee 100644
> --- a/drivers/base/power/opp.c
> +++ b/drivers/base/power/opp.c
> @@ -169,6 +169,8 @@ unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)
>  	struct dev_pm_opp *tmp_opp;
>  	unsigned long v = 0;
>  
> +	opp_rcu_lockdep_assert();
> +
>  	tmp_opp = rcu_dereference(opp);
>  	if (unlikely(IS_ERR_OR_NULL(tmp_opp)) || !tmp_opp->available)
>  		pr_err("%s: Invalid parameters\n", __func__);
> @@ -199,6 +201,8 @@ unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp)
>  	struct dev_pm_opp *tmp_opp;
>  	unsigned long f = 0;
>  
> +	opp_rcu_lockdep_assert();
> +
>  	tmp_opp = rcu_dereference(opp);
>  	if (unlikely(IS_ERR_OR_NULL(tmp_opp)) || !tmp_opp->available)
>  		pr_err("%s: Invalid parameters\n", __func__);
> 

-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] PM / QoS: Use lockdep asserts to find missing hold of power.lock
  2015-01-09  8:27 ` [PATCH 2/2] PM / QoS: Use lockdep asserts to find missing hold of power.lock Krzysztof Kozlowski
@ 2015-01-30  0:18   ` Rafael J. Wysocki
  0 siblings, 0 replies; 4+ messages in thread
From: Rafael J. Wysocki @ 2015-01-30  0:18 UTC (permalink / raw)
  To: Krzysztof Kozlowski
  Cc: Len Brown, Pavel Machek, Greg Kroah-Hartman, linux-pm, linux-kernel

On Friday, January 09, 2015 09:27:58 AM Krzysztof Kozlowski wrote:
> Add lockdep asserts for holding the dev->power.lock to non-static
> functions which require this. They could be used outside of the file so
> asserts may help in detecting locking misuse.
> 
> Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>

Queued up for 3.20, thanks!

> ---
>  drivers/base/power/qos.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/base/power/qos.c b/drivers/base/power/qos.c
> index a8fe4c1a8d07..e56d538d039e 100644
> --- a/drivers/base/power/qos.c
> +++ b/drivers/base/power/qos.c
> @@ -64,6 +64,8 @@ enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev, s32 mask)
>  	struct pm_qos_flags *pqf;
>  	s32 val;
>  
> +	lockdep_assert_held(&dev->power.lock);
> +
>  	if (IS_ERR_OR_NULL(qos))
>  		return PM_QOS_FLAGS_UNDEFINED;
>  
> @@ -104,6 +106,8 @@ EXPORT_SYMBOL_GPL(dev_pm_qos_flags);
>   */
>  s32 __dev_pm_qos_read_value(struct device *dev)
>  {
> +	lockdep_assert_held(&dev->power.lock);
> +
>  	return IS_ERR_OR_NULL(dev->power.qos) ?
>  		0 : pm_qos_read_value(&dev->power.qos->resume_latency);
>  }
> 

-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-01-29 23:55 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-09  8:27 [PATCH 1/2] PM / OPP: Assert RCU lock in exported functions Krzysztof Kozlowski
2015-01-09  8:27 ` [PATCH 2/2] PM / QoS: Use lockdep asserts to find missing hold of power.lock Krzysztof Kozlowski
2015-01-30  0:18   ` Rafael J. Wysocki
2015-01-30  0:16 ` [PATCH 1/2] PM / OPP: Assert RCU lock in exported functions Rafael J. Wysocki

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).