From 986707b461eb56d75f55581dd1c8e2633f814795 Mon Sep 17 00:00:00 2001 From: Roger Pau Monne Date: Tue, 14 Apr 2026 09:38:55 +0200 Subject: [PATCH] xen/cpu: round cpu_khz calculations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All arches truncate the cpu_khz without taking into account the less significant digits. Instead use DIV_ROUND() when scaling from Hz to kHz to get as more accurate kHz value. Signed-off-by: Roger Pau Monné Reviewed-by: Jan Beulich --- xen/arch/arm/time.c | 4 ++-- xen/arch/riscv/time.c | 2 +- xen/arch/x86/time.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/xen/arch/arm/time.c b/xen/arch/arm/time.c index a12912a106..6955b2788f 100644 --- a/xen/arch/arm/time.c +++ b/xen/arch/arm/time.c @@ -118,7 +118,7 @@ static void __init preinit_dt_xen_time(void) res = dt_property_read_u32(timer, "clock-frequency", &rate); if ( res ) { - cpu_khz = rate / 1000; + cpu_khz = DIV_ROUND(rate, 1000); validate_timer_frequency(); timer_dt_clock_frequency = rate; } @@ -136,7 +136,7 @@ void __init preinit_xen_time(void) if ( !cpu_khz ) { - cpu_khz = (READ_SYSREG(CNTFRQ_EL0) & CNTFRQ_MASK) / 1000; + cpu_khz = DIV_ROUND(READ_SYSREG(CNTFRQ_EL0) & CNTFRQ_MASK, 1000); validate_timer_frequency(); } diff --git a/xen/arch/riscv/time.c b/xen/arch/riscv/time.c index 7efa76fdbc..698ab49d12 100644 --- a/xen/arch/riscv/time.c +++ b/xen/arch/riscv/time.c @@ -40,7 +40,7 @@ static void __init preinit_dt_xen_time(void) if ( !dt_property_read_u32(timer, "timebase-frequency", &rate) ) panic("Unable to find clock frequency\n"); - cpu_khz = rate / 1000; + cpu_khz = DIV_ROUND(rate, 1000); } int reprogram_timer(s_time_t timeout) diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index 244277c0a9..008d9e97d9 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -2642,7 +2642,7 @@ void __init early_time_init(void) set_time_scale(&t->tsc_scale, tmp); t->stamp.local_tsc = boot_tsc_stamp; - cpu_khz = tmp / 1000; + cpu_khz = DIV_ROUND(tmp, 1000); printk("Detected %lu.%03lu MHz processor.\n", cpu_khz / 1000, cpu_khz % 1000);