Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86, paravirt: don't compute pvclock adjustments if we trust the tsc

If the HV told us we can fully trust the TSC, skip any
correction

Signed-off-by: Glauber Costa <glommer@redhat.com>
Acked-by: Zachary Amsden <zamsden@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

authored by

Glauber Costa and committed by
Avi Kivity
3a0d7256 838815a7

+13
+5
arch/x86/include/asm/kvm_para.h
··· 21 21 */ 22 22 #define KVM_FEATURE_CLOCKSOURCE2 3 23 23 24 + /* The last 8 bits are used to indicate how to interpret the flags field 25 + * in pvclock structure. If no bits are set, all flags are ignored. 26 + */ 27 + #define KVM_FEATURE_CLOCKSOURCE_STABLE_BIT 24 28 + 24 29 #define MSR_KVM_WALL_CLOCK 0x11 25 30 #define MSR_KVM_SYSTEM_TIME 0x12 26 31
+1
arch/x86/include/asm/pvclock-abi.h
··· 39 39 u32 nsec; 40 40 } __attribute__((__packed__)); 41 41 42 + #define PVCLOCK_TSC_STABLE_BIT (1 << 0) 42 43 #endif /* __ASSEMBLY__ */ 43 44 #endif /* _ASM_X86_PVCLOCK_ABI_H */
+3
arch/x86/kernel/kvmclock.c
··· 215 215 clocksource_register(&kvm_clock); 216 216 pv_info.paravirt_enabled = 1; 217 217 pv_info.name = "KVM"; 218 + 219 + if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE_STABLE_BIT)) 220 + pvclock_set_flags(PVCLOCK_TSC_STABLE_BIT); 218 221 }
+4
arch/x86/kernel/pvclock.c
··· 135 135 barrier(); 136 136 } while (version != src->version); 137 137 138 + if ((valid_flags & PVCLOCK_TSC_STABLE_BIT) && 139 + (shadow.flags & PVCLOCK_TSC_STABLE_BIT)) 140 + return ret; 141 + 138 142 /* 139 143 * Assumption here is that last_value, a global accumulator, always goes 140 144 * forward. If we are less than that, we should not be much smaller.