On Thu, Apr 15, 2021 at 03:21:00PM -0700, Sean Christopherson wrote: > From: Wanpeng Li <wanpengli@xxxxxxxxxxx> > > When using tick-based accounting, defer the call to account guest time > until after servicing any IRQ(s) that happened in the guest or > immediately after VM-Exit. Tick-based accounting of vCPU time relies on > PF_VCPU being set when the tick IRQ handler runs, and IRQs are blocked > throughout {svm,vmx}_vcpu_enter_exit(). > > This fixes a bug[*] where reported guest time remains '0', even when > running an infinite loop in the guest. > > [*] https://bugzilla.kernel.org/show_bug.cgi?id=209831 > > Fixes: 87fa7f3e98a131 ("x86/kvm: Move context tracking where it belongs") > Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > Cc: Sean Christopherson <seanjc@xxxxxxxxxx> > Cc: Michael Tokarev <mjt@xxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx#v5.9-rc1+ > Suggested-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > Signed-off-by: Wanpeng Li <wanpengli@xxxxxxxxxxx> > Co-developed-by: Sean Christopherson <seanjc@xxxxxxxxxx> > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index 16fb39503296..e4d475df1d4a 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -9230,6 +9230,14 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) > local_irq_disable(); > kvm_after_interrupt(vcpu); > > + /* > + * When using tick-based accounting, wait until after servicing IRQs to > + * account guest time so that any ticks that occurred while running the > + * guest are properly accounted to the guest. > + */ > + if (!vtime_accounting_enabled_this_cpu()) > + vtime_account_guest_exit(); Can we rather have instead: static inline void tick_account_guest_exit(void) { if (!vtime_accounting_enabled_this_cpu()) current->flags &= ~PF_VCPU; } It duplicates a bit of code but I think this will read less confusing. Thanks. > + > if (lapic_in_kernel(vcpu)) { > s64 delta = vcpu->arch.apic->lapic_timer.advance_expire_delta; > if (delta != S64_MIN) { > -- > 2.31.1.368.gbe11c130af-goog >