Re: [RFC PATCH 05/19] cpufreq: assert locking when accessing cpufreq_policy_list
From: Viresh Kumar
Date: Tue Jan 12 2016 - 04:38:32 EST
On 11-01-16, 17:35, Juri Lelli wrote:
> cpufreq_policy_list is guarded by cpufreq_driver_lock. Add appropriate
> locking assertions to check that we always access the list while holding
> the associated lock.
>
> Cc: "Rafael J. Wysocki" <rjw@xxxxxxxxxxxxx>
> Cc: Viresh Kumar <viresh.kumar@xxxxxxxxxx>
> Signed-off-by: Juri Lelli <juri.lelli@xxxxxxx>
> ---
> drivers/cpufreq/cpufreq.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> index 00a00cd..63d6efb 100644
> --- a/drivers/cpufreq/cpufreq.c
> +++ b/drivers/cpufreq/cpufreq.c
> @@ -65,6 +65,7 @@ static bool suitable_policy(struct cpufreq_policy *policy, bool active)
> static struct cpufreq_policy *next_policy(struct cpufreq_policy *policy,
> bool active)
> {
> + lockdep_assert_held(&cpufreq_driver_lock);
> do {
> policy = list_next_entry(policy, policy_list);
>
> @@ -80,6 +81,7 @@ static struct cpufreq_policy *first_policy(bool active)
> {
> struct cpufreq_policy *policy;
>
> + lockdep_assert_held(&cpufreq_driver_lock);
Because both first_policy() and next_policy() are parts of
for_each_suitable_policy() macro, checking this in first_policy() is
sufficient. next_policy() isn't designed to be used by any other code.
> /* No policies in the list */
> if (list_empty(&cpufreq_policy_list))
> return NULL;
> @@ -2430,6 +2432,7 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
> if (ret)
> goto err_boost_unreg;
>
> + lockdep_assert_held(&cpufreq_driver_lock);
Why do you need a cpufreq_driver_lock here? And the above change
should generate a lockdep here as the lock isn't taken right now.
> if (!(cpufreq_driver->flags & CPUFREQ_STICKY) &&
> list_empty(&cpufreq_policy_list)) {
> /* if all ->init() calls failed, unregister */
> --
> 2.2.2
--
viresh