On Wed, May 22, 2024, David Woodhouse wrote: > From: David Woodhouse <dwmw@xxxxxxxxxxxx> > > Let the callers pass the host TSC value in as an explicit parameter. > > This leaves some fairly obviously stupid code, which using this function > to compare the guest TSC at some *other* time, with the newly-minted TSC > value from rdtsc(). Unless it's being used to measure *elapsed* time, > that isn't very sensible. > > In this case, "obviously stupid" is an improvement over being non-obviously > so. > > No functional change intended. > > Signed-off-by: David Woodhouse <dwmw@xxxxxxxxxxxx> > --- > arch/x86/kvm/x86.c | 14 ++++++++------ > 1 file changed, 8 insertions(+), 6 deletions(-) > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index ef3cd6113037..ea59694d712a 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -2601,11 +2601,12 @@ u64 kvm_scale_tsc(u64 tsc, u64 ratio) > return _tsc; > } > > -static u64 kvm_compute_l1_tsc_offset(struct kvm_vcpu *vcpu, u64 target_tsc) > +static u64 kvm_compute_l1_tsc_offset(struct kvm_vcpu *vcpu, u64 host_tsc, > + u64 target_tsc) Would it make sense to have a __kvm_compute_l1_tsc_offset() version that takes in the host TSC, and then this? static u64 kvm_compute_l1_tsc_offset(struct kvm_vcpu *vcpu, u64 target_tsc) { return __kvm_compute_l1_tsc_offset(vcpu, rdtsc(), target_tsc); } Hmm, or maybe a better option would be: static u64 kvm_compute_current_l1_tsc_offset(struct kvm_vcpu *vcpu, u64 target_tsc) { return kvm_compute_l1_tsc_offset(vcpu, rdtsc(), target_tsc); } Meh, after typing those out, I don't like either one. Let's keep it how you wrote it, I think there's quite a bit of added readability by forcing callers to provide the host TSC. > { > u64 tsc; > > - tsc = kvm_scale_tsc(rdtsc(), vcpu->arch.l1_tsc_scaling_ratio); > + tsc = kvm_scale_tsc(host_tsc, vcpu->arch.l1_tsc_scaling_ratio); > > return target_tsc - tsc; Opportunistically drop "tsc" too? E.g. return target_tsc - kvm_scale_tsc(host_tsc, vcpu->arch.l1_tsc_scaling_ratio); or return target_tsc - kvm_scale_tsc(host_tsc, vcpu->arch.l1_tsc_scaling_ratio); I find either of those much easier to read.