aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Torokhov <dtor@chromium.org>2014-12-16 18:09:36 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2014-12-17 19:42:49 -0500
commitb02ded246d011d0eb22efc178ee711b636214083 (patch)
treee4a2a633d246649a21e5813af9793686730275f6
parent6ce4184d0308888dd6ac2b6ab5f8ec0b2006092e (diff)
PM / OPP: add some lockdep annotations
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> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r--drivers/base/power/opp.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/base/power/opp.c b/drivers/base/power/opp.c
index d24dd614a0bd..b78c14d30da2 100644
--- a/drivers/base/power/opp.c
+++ b/drivers/base/power/opp.c
@@ -108,6 +108,14 @@ static LIST_HEAD(dev_opp_list);
108/* Lock to allow exclusive modification to the device and opp lists */ 108/* Lock to allow exclusive modification to the device and opp lists */
109static DEFINE_MUTEX(dev_opp_list_lock); 109static DEFINE_MUTEX(dev_opp_list_lock);
110 110
111#define opp_rcu_lockdep_assert() \
112do { \
113 rcu_lockdep_assert(rcu_read_lock_held() || \
114 lockdep_is_held(&dev_opp_list_lock), \
115 "Missing rcu_read_lock() or " \
116 "dev_opp_list_lock protection"); \
117} while (0)
118
111/** 119/**
112 * find_device_opp() - find device_opp struct using device pointer 120 * find_device_opp() - find device_opp struct using device pointer
113 * @dev: device pointer used to lookup device OPPs 121 * @dev: device pointer used to lookup device OPPs
@@ -218,6 +226,8 @@ int dev_pm_opp_get_opp_count(struct device *dev)
218 struct dev_pm_opp *temp_opp; 226 struct dev_pm_opp *temp_opp;
219 int count = 0; 227 int count = 0;
220 228
229 opp_rcu_lockdep_assert();
230
221 dev_opp = find_device_opp(dev); 231 dev_opp = find_device_opp(dev);
222 if (IS_ERR(dev_opp)) { 232 if (IS_ERR(dev_opp)) {
223 int r = PTR_ERR(dev_opp); 233 int r = PTR_ERR(dev_opp);
@@ -267,6 +277,8 @@ struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
267 struct device_opp *dev_opp; 277 struct device_opp *dev_opp;
268 struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE); 278 struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
269 279
280 opp_rcu_lockdep_assert();
281
270 dev_opp = find_device_opp(dev); 282 dev_opp = find_device_opp(dev);
271 if (IS_ERR(dev_opp)) { 283 if (IS_ERR(dev_opp)) {
272 int r = PTR_ERR(dev_opp); 284 int r = PTR_ERR(dev_opp);
@@ -313,6 +325,8 @@ struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
313 struct device_opp *dev_opp; 325 struct device_opp *dev_opp;
314 struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE); 326 struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
315 327
328 opp_rcu_lockdep_assert();
329
316 if (!dev || !freq) { 330 if (!dev || !freq) {
317 dev_err(dev, "%s: Invalid argument freq=%p\n", __func__, freq); 331 dev_err(dev, "%s: Invalid argument freq=%p\n", __func__, freq);
318 return ERR_PTR(-EINVAL); 332 return ERR_PTR(-EINVAL);
@@ -361,6 +375,8 @@ struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
361 struct device_opp *dev_opp; 375 struct device_opp *dev_opp;
362 struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE); 376 struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
363 377
378 opp_rcu_lockdep_assert();
379
364 if (!dev || !freq) { 380 if (!dev || !freq) {
365 dev_err(dev, "%s: Invalid argument freq=%p\n", __func__, freq); 381 dev_err(dev, "%s: Invalid argument freq=%p\n", __func__, freq);
366 return ERR_PTR(-EINVAL); 382 return ERR_PTR(-EINVAL);