All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sean Christopherson <seanjc@google.com>
To: "Durrant, Paul" <pdurrant@amazon.co.uk>
Cc: "x86@kernel.org" <x86@kernel.org>,
	"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Vitaly Kuznetsov <vkuznets@redhat.com>,
	Wanpeng Li <wanpengli@tencent.com>,
	Jim Mattson <jmattson@google.com>, Joerg Roedel <joro@8bytes.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	"H. Peter Anvin" <hpa@zytor.com>
Subject: Re: [PATCH] KVM: x86/xen: Update Xen CPUID Leaf 4 (tsc info) sub-leaves, if present
Date: Mon, 27 Jun 2022 15:51:48 +0000	[thread overview]
Message-ID: <YrnSFGURsmxV2Qmu@google.com> (raw)
In-Reply-To: <0abf9f5de09e45ef9eb06b56bf16e3e6@EX13D32EUC003.ant.amazon.com>

On Mon, Jun 27, 2022, Durrant, Paul wrote:
> > -----Original Message-----
> [snip]
> > > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> > > > index 00e23dc518e0..8b45f9975e45 100644
> > > > --- a/arch/x86/kvm/x86.c
> > > > +++ b/arch/x86/kvm/x86.c
> > > > @@ -3123,6 +3123,7 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
> > > >       if (vcpu->xen.vcpu_time_info_cache.active)
> > > >               kvm_setup_guest_pvclock(v, &vcpu->xen.vcpu_time_info_cache, 0);
> > > >       kvm_hv_setup_tsc_page(v->kvm, &vcpu->hv_clock);
> > > > +     kvm_xen_setup_tsc_info(v);
> > >
> > > This can be called inside this if statement, no?
> > >
> > >         if (unlikely(vcpu->hw_tsc_khz != tgt_tsc_khz)) {
> > >
> > >         }
> > >
> 
> I think it ought to be done whenever the shared copy of Xen's vcpu_info is
> updated (it will always match on real Xen) so unconditionally calling it here
> seems reasonable.

But isn't the call pointless if the vCPU's hw_tsc_khz is unchanged?  E.g if the
params were explicitly passed in, then it would look like:

	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);
		vcpu->hw_tsc_khz = tgt_tsc_khz;

		kvm_xen_setup_tsc_info(vcpu, tgt_tsc_khz,
				       vcpu->hv_clock.tsc_shift,
				       vcpu->hv_clock.tsc_to_system_mul);
	}

Explicitly passing in the arguments probably isn't necessary, just use a more
precise name, e.g. kvm_xen_update_tsc_khz(), to make it clear that the update is
limited to TSC frequency changes.

> > > > +{
> > > > +     u32 base = 0;
> > > > +     u32 function;
> > > > +
> > > > +     for_each_possible_hypervisor_cpuid_base(function) {
> > > > +             struct kvm_cpuid_entry2 *entry = kvm_find_cpuid_entry(vcpu, function, 0);
> > > > +
> > > > +             if (entry &&
> > > > +                 entry->ebx == XEN_CPUID_SIGNATURE_EBX &&
> > > > +                 entry->ecx == XEN_CPUID_SIGNATURE_ECX &&
> > > > +                 entry->edx == XEN_CPUID_SIGNATURE_EDX) {
> > > > +                     base = function;
> > > > +                     break;
> > > > +             }
> > > > +     }
> > > > +     if (!base)
> > > > +             return;
> > > > +
> > > > +     function = base | XEN_CPUID_LEAF(3);
> > > > +     vcpu->arch.xen.tsc_info_1 = kvm_find_cpuid_entry(vcpu, function, 1);
> > > > +     vcpu->arch.xen.tsc_info_2 = kvm_find_cpuid_entry(vcpu, function, 2);
> > >
> > > Is it really necessary to cache the leave?  Guest CPUID isn't optimized, but it's
> > > not _that_ slow, and unless I'm missing something updating the TSC frequency and
> > > scaling info should be uncommon, i.e. not performance critical.
> 
> If we're updating the values in the leaves on every entry into the guest (as
> with calls to kvm_setup_guest_pvclock()) then I think the cached pointers are
> worthwhile.

But why would you update on every entry to the guest?   Isn't this a rare operation
if the update is limited to changes in the host CPU's TSC frequency?  Or am I
missing something?

  reply	other threads:[~2022-06-27 15:52 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-22  9:22 [PATCH] KVM: x86/xen: Update Xen CPUID Leaf 4 (tsc info) sub-leaves, if present Paul Durrant
2022-06-22  9:39 ` Vitaly Kuznetsov
2022-06-22  9:50   ` Durrant, Paul
2022-06-22 14:44 ` Sean Christopherson
2022-06-22 15:01   ` Durrant, Paul
2022-06-27 15:32     ` Durrant, Paul
2022-06-27 15:51       ` Sean Christopherson [this message]
2022-06-27 15:56         ` Durrant, Paul

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YrnSFGURsmxV2Qmu@google.com \
    --to=seanjc@google.com \
    --cc=bp@alien8.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=jmattson@google.com \
    --cc=joro@8bytes.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=pdurrant@amazon.co.uk \
    --cc=tglx@linutronix.de \
    --cc=vkuznets@redhat.com \
    --cc=wanpengli@tencent.com \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.