On Fri, 7 Aug 2020 at 01:56, Oliver Upton <oupton@xxxxxxxxxx> wrote: > > No functional change intended. > > Reviewed-by: Jim Mattson <jmattson@xxxxxxxxxx> > Reviewed-by: Peter Shier <pshier@xxxxxxxxxx> > Signed-off-by: Oliver Upton <oupton@xxxxxxxxxx> Reviewed-by: Wanpeng Li <wanpengli@xxxxxxxxxxx> > --- > arch/x86/kvm/x86.c | 58 +++++++++++++++++++++++++--------------------- > 1 file changed, 32 insertions(+), 26 deletions(-) > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index dc4370394ab8..5ba713108686 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -1822,6 +1822,34 @@ static void kvm_write_wall_clock(struct kvm *kvm, gpa_t wall_clock) > kvm_write_guest(kvm, wall_clock, &version, sizeof(version)); > } > > +static void kvm_write_system_time(struct kvm_vcpu *vcpu, gpa_t system_time, > + bool old_msr, bool host_initiated) > +{ > + struct kvm_arch *ka = &vcpu->kvm->arch; > + > + if (vcpu->vcpu_id == 0 && !host_initiated) { > + if (ka->boot_vcpu_runs_old_kvmclock && old_msr) > + kvm_make_request(KVM_REQ_MASTERCLOCK_UPDATE, vcpu); > + > + ka->boot_vcpu_runs_old_kvmclock = old_msr; > + } > + > + vcpu->arch.time = system_time; > + kvm_make_request(KVM_REQ_GLOBAL_CLOCK_UPDATE, vcpu); > + > + /* we verify if the enable bit is set... */ > + vcpu->arch.pv_time_enabled = false; > + if (!(system_time & 1)) > + return; > + > + if (!kvm_gfn_to_hva_cache_init(vcpu->kvm, > + &vcpu->arch.pv_time, system_time & ~1ULL, > + sizeof(struct pvclock_vcpu_time_info))) > + vcpu->arch.pv_time_enabled = true; > + > + return; > +} > + > static uint32_t div_frac(uint32_t dividend, uint32_t divisor) > { > do_shl32_div32(dividend, divisor); > @@ -2973,33 +3001,11 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) > kvm_write_wall_clock(vcpu->kvm, data); > break; > case MSR_KVM_SYSTEM_TIME_NEW: > - case MSR_KVM_SYSTEM_TIME: { > - struct kvm_arch *ka = &vcpu->kvm->arch; > - > - if (vcpu->vcpu_id == 0 && !msr_info->host_initiated) { > - bool tmp = (msr == MSR_KVM_SYSTEM_TIME); > - > - if (ka->boot_vcpu_runs_old_kvmclock != tmp) > - kvm_make_request(KVM_REQ_MASTERCLOCK_UPDATE, vcpu); > - > - ka->boot_vcpu_runs_old_kvmclock = tmp; > - } > - > - vcpu->arch.time = data; > - kvm_make_request(KVM_REQ_GLOBAL_CLOCK_UPDATE, vcpu); > - > - /* we verify if the enable bit is set... */ > - vcpu->arch.pv_time_enabled = false; > - if (!(data & 1)) > - break; > - > - if (!kvm_gfn_to_hva_cache_init(vcpu->kvm, > - &vcpu->arch.pv_time, data & ~1ULL, > - sizeof(struct pvclock_vcpu_time_info))) > - vcpu->arch.pv_time_enabled = true; > - > + kvm_write_system_time(vcpu, data, false, msr_info->host_initiated); > + break; > + case MSR_KVM_SYSTEM_TIME: > + kvm_write_system_time(vcpu, data, true, msr_info->host_initiated); > break; > - } > case MSR_KVM_ASYNC_PF_EN: > if (kvm_pv_enable_async_pf(vcpu, data)) > return 1; > -- > 2.28.0.236.gb10cc79966-goog >