[PATCH] cpufreq: acpi-cpufreq: Using cpufreq_for_each_entry() to iterate in extract_io()
lirongqing <[email protected]>
| Newsgroups | org.kernel.vger.linux-pm |
|---|---|
| Message-ID | <[email protected]> |
From: Li RongQing <[email protected]> In extract_io(), the loop iterates up to perf->state_count. However, when building policy->freq_table in acpi_cpufreq_cpu_init(), duplicate frequency entries are skipped, making freq_table smaller than perf->state_count. Iterating perf->state_count times directly over policy->freq_table[i] can result in out-of-bounds array reads. Furthermore, policy->freq_table[i] does not necessarily correspond to perf->states[i], as the original P-state index is stored in freq_table[entry].driver_data. Fix this by using cpufreq_for_each_entry() to iterate over policy->freq_table, similar to extract_msr(). Signed-off-by: Li RongQing <[email protected]> --- drivers/cpufreq/acpi-cpufreq.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c index 21639d9..87e4923 100644 --- a/drivers/cpufreq/acpi-cpufreq.c +++ b/drivers/cpufreq/acpi-cpufreq.c @@ -196,15 +196,14 @@ static int check_amd_hwpstate_cpu(unsigned int cpuid) static unsigned extract_io(struct cpufreq_policy *policy, u32 value) { struct acpi_cpufreq_data *data = policy->driver_data; + struct cpufreq_frequency_table *pos; struct acpi_processor_performance *perf; - int i; perf = to_perf_data(data); - for (i = 0; i < perf->state_count; i++) { - if (value == perf->states[i].status) - return policy->freq_table[i].frequency; - } + cpufreq_for_each_entry(pos, policy->freq_table) + if (value == perf->states[pos->driver_data].status) + return pos->frequency; return 0; } -- 2.9.4