From be58d3002fdc3fb5b24c0bcd2453232d1d911005 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= Date: Wed, 4 Mar 2026 14:52:54 +0100 Subject: [PATCH] xen/cpufreq: fix adjusting of sampling window on early exit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The logic in dbs_check_cpu() resets the sampling window even when the sampling period is considered too small. This leads to further calls finding an imbalance between the total window time and the idle time, as the total window time is possibly shorter than the idle time. Fix by resetting the sampling window start time in the same block where the current idle time is stored. While there also prevent a duplicated call to NOW() and instead re-use the previously fetched value. Fixes: d6f001cb91ac ("x86: Implement cpufreq ondemand policy") Signed-off-by: Roger Pau Monné Reviewed-by: Jan Beulich master commit: 74867aae25cb6356b8a7d1140c81666e2a23b818 master date: 2026-03-02 17:16:26 +0100 --- xen/drivers/cpufreq/cpufreq_ondemand.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xen/drivers/cpufreq/cpufreq_ondemand.c b/xen/drivers/cpufreq/cpufreq_ondemand.c index 06cfc88d30..f62678fa61 100644 --- a/xen/drivers/cpufreq/cpufreq_ondemand.c +++ b/xen/drivers/cpufreq/cpufreq_ondemand.c @@ -115,11 +115,12 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info) cur_ns = NOW(); total_ns = cur_ns - this_dbs_info->prev_cpu_wall; - this_dbs_info->prev_cpu_wall = NOW(); if (total_ns < MIN_DBS_INTERVAL) return; + this_dbs_info->prev_cpu_wall = cur_ns; + /* Get Idle Time */ for_each_cpu(j, policy->cpus) { uint64_t idle_ns, total_idle_ns;