Re: [PATCH] cpufreq: acpi-cpufreq: add NULL check for acpi_perf_data before freeing
Zhongqiu Han <[email protected]>
| Newsgroups | org.kernel.vger.linux-pm |
|---|---|
| Message-ID | <[email protected]> |
On 8/10/2026 2:10 PM, lirongqing wrote: > From: Li RongQing <[email protected]> > > If alloc_percpu() fails in acpi_cpufreq_early_init(), acpi_perf_data is > NULL. Calling free_acpi_perf_data() will execute per_cpu_ptr(NULL, i), > which does not return NULL but an offset pointer. Hi RongQing, Could you please confirm if acpi_perf_data() can ever be executed when alloc_percpu() fails? > Dereferencing ->shared_cpu_map on this invalid pointer leads to a kernel > crash. > > Fix these issues by adding a NULL check at the start of > free_acpi_perf_data() and setting acpi_perf_data to NULL after freeing. > > Signed-off-by: Li RongQing <[email protected]> > --- > drivers/cpufreq/acpi-cpufreq.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c > index 87e4923..cd2ca87 100644 > --- a/drivers/cpufreq/acpi-cpufreq.c > +++ b/drivers/cpufreq/acpi-cpufreq.c > @@ -517,11 +517,14 @@ static void free_acpi_perf_data(void) > { > unsigned int i; > > - /* Freeing a NULL pointer is OK, and alloc_percpu zeroes. */ > + if (!acpi_perf_data) > + return; > + > for_each_possible_cpu(i) > free_cpumask_var(per_cpu_ptr(acpi_perf_data, i) > ->shared_cpu_map); > free_percpu(acpi_perf_data); > + acpi_perf_data = NULL; > } > > static int cpufreq_boost_down_prep(unsigned int cpu) -- Thx and BRs, Zhongqiu Han