From 517b16173e1d8471583d17588096fe8ed3bbbbeb Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Wed, 4 Oct 2023 09:45:25 +0100 Subject: [PATCH] Sean's kvmclock sync hack #2 --- arch/x86/kvm/x86.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 6631f9a2a366a..9443c4b266599 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -3207,9 +3207,23 @@ static int kvm_guest_time_update(struct kvm_vcpu *v) v->arch.l1_tsc_scaling_ratio); if (unlikely(vcpu->hw_tsc_khz != tgt_tsc_khz)) { - kvm_get_time_scale(NSEC_PER_SEC, tgt_tsc_khz * 1000LL, - &vcpu->hv_clock.tsc_shift, - &vcpu->hv_clock.tsc_to_system_mul); + u32 shift, mult; + + clocks_calc_mult_shift(&mult, &shift, tgt_tsc_khz, NSEC_PER_MSEC, 600); + + if (shift <= 32) { + vcpu->hv_clock.tsc_shift = 0; + vcpu->hv_clock.tsc_to_system_mul = mult * BIT(32 - shift); + printk("good shift %d mult %u for %ld kHz\n", vcpu->hv_clock.tsc_shift, + vcpu->hv_clock.tsc_to_system_mul, tgt_tsc_khz); + } else { + kvm_get_time_scale(NSEC_PER_SEC, tgt_tsc_khz * 1000LL, + &vcpu->hv_clock.tsc_shift, + &vcpu->hv_clock.tsc_to_system_mul); + printk("bad shift %d mult %u for %ld khz\n", vcpu->hv_clock.tsc_shift, + vcpu->hv_clock.tsc_to_system_mul, tgt_tsc_khz); + } + vcpu->hw_tsc_khz = tgt_tsc_khz; kvm_xen_update_tsc_info(v); } -- 2.50.1