Error paths of cpufreq_statistic_init() correctly free the base
structure pointer, but the per-CPU variable would still hold it, mis-
guiding e.g. cpufreq_statistic_update(). Defer installing of the pointer
there until the structure was fully populated.
Fixes: 755af07edba1 ("x86/cpufreq: don't use static array for large per-CPU data structures")
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/drivers/cpufreq/utility.c
+++ b/xen/drivers/cpufreq/utility.c
@@ -113,7 +113,6 @@ int cpufreq_statistic_init(unsigned int
spin_unlock(cpufreq_statistic_lock);
return -ENOMEM;
}
- per_cpu(cpufreq_statistic_data, cpu) = pxpt;
pxpt->u.trans_pt = xzalloc_array(uint64_t, count * count);
if (!pxpt->u.trans_pt) {
@@ -139,6 +138,8 @@ int cpufreq_statistic_init(unsigned int
pxpt->prev_state_wall = NOW();
pxpt->prev_idle_wall = get_cpu_idle_time(cpu);
+ per_cpu(cpufreq_statistic_data, cpu) = pxpt;
+
spin_unlock(cpufreq_statistic_lock);
return 0;
On 29/04/2025 2:37 pm, Jan Beulich wrote:
> Error paths of cpufreq_statistic_init() correctly free the base
> structure pointer, but the per-CPU variable would still hold it, mis-
> guiding e.g. cpufreq_statistic_update(). Defer installing of the pointer
> there until the structure was fully populated.
>
> Fixes: 755af07edba1 ("x86/cpufreq: don't use static array for large per-CPU data structures")
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
© 2016 - 2026 Red Hat, Inc.