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

Commit 8cfcfd39 authored by Pan Xinhui's avatar Pan Xinhui Committed by Rafael J. Wysocki
Browse files

acpi-cpufreq: Fix an ACPI perf unregister issue



As policy->cpu may not be same in acpi_cpufreq_cpu_init() and
acpi_cpufreq_cpu_exit(). There is a risk that we use different CPU
to un/register ACPI performance. So acpi_processor_unregister_performance()
may not be able to do the cleanup work. That causes a memory leak. And
if there will be another acpi_processor_register_performance() call,
it may also fail thanks to the internal check of pr->performace.

So add a new struct acpi_cpufreq_data field, acpi_perf_cpu, to fix
this issue.

Signed-off-by: default avatarPan Xinhui <xinhuix.pan@intel.com>
Acked-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
[ rjw: Changelog ]
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 7f0fa40f
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -69,6 +69,7 @@ struct acpi_cpufreq_data {
	struct cpufreq_frequency_table *freq_table;
	struct cpufreq_frequency_table *freq_table;
	unsigned int resume;
	unsigned int resume;
	unsigned int cpu_feature;
	unsigned int cpu_feature;
	unsigned int acpi_perf_cpu;
	cpumask_var_t freqdomain_cpus;
	cpumask_var_t freqdomain_cpus;
};
};


@@ -677,6 +678,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
	}
	}


	data->acpi_data = per_cpu_ptr(acpi_perf_data, cpu);
	data->acpi_data = per_cpu_ptr(acpi_perf_data, cpu);
	data->acpi_perf_cpu = cpu;
	policy->driver_data = data;
	policy->driver_data = data;


	if (cpu_has(c, X86_FEATURE_CONSTANT_TSC))
	if (cpu_has(c, X86_FEATURE_CONSTANT_TSC))
@@ -861,7 +863,7 @@ static int acpi_cpufreq_cpu_exit(struct cpufreq_policy *policy)
	if (data) {
	if (data) {
		policy->driver_data = NULL;
		policy->driver_data = NULL;
		acpi_processor_unregister_performance(data->acpi_data,
		acpi_processor_unregister_performance(data->acpi_data,
						      policy->cpu);
						      data->acpi_perf_cpu);
		free_cpumask_var(data->freqdomain_cpus);
		free_cpumask_var(data->freqdomain_cpus);
		kfree(data->freq_table);
		kfree(data->freq_table);
		kfree(data);
		kfree(data);