aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrzysztof Kozlowski <k.kozlowski@samsung.com>2015-01-09 03:27:57 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2015-01-23 16:32:38 -0500
commit04bf1c7f76b05be8134a833ec023f1c96f81b8a1 (patch)
tree0963cc88a63e7201f1bf46125cfed519164f9e9e
parent984f16c8490cba715444124a453ed4a2ac7a5a54 (diff)
PM / OPP: Assert RCU lock in exported functions
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> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r--drivers/base/power/opp.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/base/power/opp.c b/drivers/base/power/opp.c
index 1d20e095569c..15bf29974c31 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)
169 struct dev_pm_opp *tmp_opp; 169 struct dev_pm_opp *tmp_opp;
170 unsigned long v = 0; 170 unsigned long v = 0;
171 171
172 opp_rcu_lockdep_assert();
173
172 tmp_opp = rcu_dereference(opp); 174 tmp_opp = rcu_dereference(opp);
173 if (unlikely(IS_ERR_OR_NULL(tmp_opp)) || !tmp_opp->available) 175 if (unlikely(IS_ERR_OR_NULL(tmp_opp)) || !tmp_opp->available)
174 pr_err("%s: Invalid parameters\n", __func__); 176 pr_err("%s: Invalid parameters\n", __func__);
@@ -199,6 +201,8 @@ unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp)
199 struct dev_pm_opp *tmp_opp; 201 struct dev_pm_opp *tmp_opp;
200 unsigned long f = 0; 202 unsigned long f = 0;
201 203
204 opp_rcu_lockdep_assert();
205
202 tmp_opp = rcu_dereference(opp); 206 tmp_opp = rcu_dereference(opp);
203 if (unlikely(IS_ERR_OR_NULL(tmp_opp)) || !tmp_opp->available) 207 if (unlikely(IS_ERR_OR_NULL(tmp_opp)) || !tmp_opp->available)
204 pr_err("%s: Invalid parameters\n", __func__); 208 pr_err("%s: Invalid parameters\n", __func__);