Sean's kvmclock sync hack #2 kvmclock
authorDavid Woodhouse <dwmw@amazon.co.uk>
Wed, 4 Oct 2023 08:45:25 +0000 (09:45 +0100)
committerDavid Woodhouse <dwmw@amazon.co.uk>
Wed, 4 Oct 2023 08:45:25 +0000 (09:45 +0100)
arch/x86/kvm/x86.c

index 6631f9a2a366a17bf500b4ee287a1ca882db8de7..9443c4b266599b33200235d4895d102f300ed7f7 100644 (file)
@@ -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);
        }