aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq/cpufreq.c
diff options
context:
space:
mode:
authorViresh Kumar <viresh.kumar@linaro.org>2013-08-20 02:38:23 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-08-20 09:43:50 -0400
commit9515f4d69b92feafe37581047a1bb41e41602faa (patch)
treee36e7c5c978e7a84c7af393340ba28d55296a9dc /drivers/cpufreq/cpufreq.c
parentedab2fbc21b9eb37007ad8bffe1159d536bbb451 (diff)
cpufreq: remove policy from cpufreq_policy_list during suspend
cpufreq_policy_list is a list of active policies. We do remove policies from this list when all CPUs belonging to that policy are removed. But during system suspend we don't really free a policy struct as it will be used again during resume, so we didn't remove it from cpufreq_policy_list as well.. However, this is incorrect. We are saying this policy isn't valid anymore and must not be referenced (though we haven't freed it), but it can still be used by code that iterates over cpufreq_policy_list. Remove policy from this list during system suspend as well. Of course, we must add it back whenever the first CPU belonging to that policy shows up. [rjw: Changelog] Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/cpufreq/cpufreq.c')
-rw-r--r--drivers/cpufreq/cpufreq.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index fedc8420214e..030212104fe6 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -950,12 +950,6 @@ err_free_policy:
950 950
951static void cpufreq_policy_free(struct cpufreq_policy *policy) 951static void cpufreq_policy_free(struct cpufreq_policy *policy)
952{ 952{
953 unsigned long flags;
954
955 write_lock_irqsave(&cpufreq_driver_lock, flags);
956 list_del(&policy->policy_list);
957 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
958
959 free_cpumask_var(policy->related_cpus); 953 free_cpumask_var(policy->related_cpus);
960 free_cpumask_var(policy->cpus); 954 free_cpumask_var(policy->cpus);
961 kfree(policy); 955 kfree(policy);
@@ -1069,12 +1063,12 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif,
1069 ret = cpufreq_add_dev_interface(policy, dev); 1063 ret = cpufreq_add_dev_interface(policy, dev);
1070 if (ret) 1064 if (ret)
1071 goto err_out_unregister; 1065 goto err_out_unregister;
1072
1073 write_lock_irqsave(&cpufreq_driver_lock, flags);
1074 list_add(&policy->policy_list, &cpufreq_policy_list);
1075 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
1076 } 1066 }
1077 1067
1068 write_lock_irqsave(&cpufreq_driver_lock, flags);
1069 list_add(&policy->policy_list, &cpufreq_policy_list);
1070 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
1071
1078 cpufreq_init_policy(policy); 1072 cpufreq_init_policy(policy);
1079 1073
1080 kobject_uevent(&policy->kobj, KOBJ_ADD); 1074 kobject_uevent(&policy->kobj, KOBJ_ADD);
@@ -1280,6 +1274,11 @@ static int __cpufreq_remove_dev(struct device *dev,
1280 if (cpufreq_driver->exit) 1274 if (cpufreq_driver->exit)
1281 cpufreq_driver->exit(policy); 1275 cpufreq_driver->exit(policy);
1282 1276
1277 /* Remove policy from list of active policies */
1278 write_lock_irqsave(&cpufreq_driver_lock, flags);
1279 list_del(&policy->policy_list);
1280 write_unlock_irqrestore(&cpufreq_driver_lock, flags);
1281
1283 if (!frozen) 1282 if (!frozen)
1284 cpufreq_policy_free(policy); 1283 cpufreq_policy_free(policy);
1285 } else { 1284 } else {