答复: [外部邮件] Re: [PATCH] cpufreq: a cpi-cpufreq: add NULL check for acpi_perf_dat a before freeing
"Li,Rongqing" <[email protected]>
| Newsgroups | org.kernel.vger.linux-pm |
|---|---|
| Message-ID | <[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? You are right, acpi_perf_data() can not be called when alloc_percpu() fails Please drop this patch thanks [Li,Rongqing] > > > > 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