Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit de52a2a1 authored by Maria Yu's avatar Maria Yu
Browse files

cpufreq: Use correct locking for cpufreq_cpu_data



Use write lock when updating cpufreq_cpu_data,
and read lock when getting the policy pointer.

CRs-Fixed: 689522
Change-Id: I454f0d575157b3411d369e04097386f50aeaaa1c
Signed-off-by: default avatarMaria Yu <aiquny@codeaurora.org>
parent 2a27b376
Loading
Loading
Loading
Loading
+14 −4
Original line number Diff line number Diff line
@@ -1276,10 +1276,10 @@ static int __cpufreq_remove_dev_finish(struct device *dev,
	unsigned long flags;
	struct cpufreq_policy *policy;

	read_lock_irqsave(&cpufreq_driver_lock, flags);
	write_lock_irqsave(&cpufreq_driver_lock, flags);
	policy = per_cpu(cpufreq_cpu_data, cpu);
	per_cpu(cpufreq_cpu_data, cpu) = NULL;
	read_unlock_irqrestore(&cpufreq_driver_lock, flags);
	write_unlock_irqrestore(&cpufreq_driver_lock, flags);

	if (!policy) {
		pr_debug("%s: No cpu_data found\n", __func__);
@@ -1445,12 +1445,17 @@ EXPORT_SYMBOL(cpufreq_quick_get_max);

static unsigned int __cpufreq_get(unsigned int cpu)
{
	struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu);
	struct cpufreq_policy *policy;
	unsigned int ret_freq = 0;
	unsigned long flags;

	if (!cpufreq_driver->get)
		return ret_freq;

	read_lock_irqsave(&cpufreq_driver_lock, flags);
	policy = per_cpu(cpufreq_cpu_data, cpu);
	read_unlock_irqrestore(&cpufreq_driver_lock, flags);

	ret_freq = cpufreq_driver->get(cpu);

	if (ret_freq && policy->cur &&
@@ -1474,12 +1479,17 @@ static unsigned int __cpufreq_get(unsigned int cpu)
 */
unsigned int cpufreq_get(unsigned int cpu)
{
	struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu);
	struct cpufreq_policy *policy;
	unsigned int ret_freq = 0;
	unsigned long flags;

	if (cpufreq_disabled() || !cpufreq_driver)
		return -ENOENT;

	read_lock_irqsave(&cpufreq_driver_lock, flags);
	policy = per_cpu(cpufreq_cpu_data, cpu);
	read_unlock_irqrestore(&cpufreq_driver_lock, flags);

	BUG_ON(!policy);

	if (!down_read_trylock(&cpufreq_rwsem))