diff options
author | Dmitry Torokhov <dtor@chromium.org> | 2014-12-16 18:09:36 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-12-17 19:42:49 -0500 |
commit | b02ded246d011d0eb22efc178ee711b636214083 (patch) | |
tree | e4a2a633d246649a21e5813af9793686730275f6 | |
parent | 6ce4184d0308888dd6ac2b6ab5f8ec0b2006092e (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.c | 16 |
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 */ |
109 | static DEFINE_MUTEX(dev_opp_list_lock); | 109 | static DEFINE_MUTEX(dev_opp_list_lock); |
110 | 110 | ||
111 | #define opp_rcu_lockdep_assert() \ | ||
112 | do { \ | ||
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); |