From: Jan Beulich Date: Wed, 30 Apr 2025 06:47:49 +0000 (+0200) Subject: cpufreq: don't leave stale statistics pointer X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=a1ce987411f61dbf5fe64bba0cd3d36d7cc0311f;p=xen.git cpufreq: don't leave stale statistics pointer 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 Acked-by: Andrew Cooper --- diff --git a/xen/drivers/cpufreq/utility.c b/xen/drivers/cpufreq/utility.c index ac2889d496..309c0682cf 100644 --- a/xen/drivers/cpufreq/utility.c +++ b/xen/drivers/cpufreq/utility.c @@ -113,7 +113,6 @@ int cpufreq_statistic_init(unsigned int cpu) 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 cpu) 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;