From: Vitaly Kuznetsov <vkuznets@redhat.com>
To: Kele Huang <huangkele@bytedance.com>, pbonzini@redhat.com
Cc: chaiwen.cc@bytedance.com, xieyongji@bytedance.com,
dengliang.1214@bytedance.com, pizhenwei@bytedance.com,
wanpengli@tencent.com, seanjc@google.com,
huangkele@bytedance.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>,
x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [RFC] KVM: x86: SVM: don't expose PV_SEND_IPI feature with AVIC
Date: Mon, 08 Nov 2021 11:45:02 +0100 [thread overview]
Message-ID: <87ilx3j58x.fsf@vitty.brq.redhat.com> (raw)
In-Reply-To: <20211108095931.618865-1-huangkele@bytedance.com>
Kele Huang <huangkele@bytedance.com> writes:
> Currently, AVIC is disabled if x2apic feature is exposed to guest
> or in-kernel PIT is in re-injection mode.
>
> We can enable AVIC with options:
>
> Kmod args:
> modprobe kvm_amd avic=1 nested=0 npt=1
> QEMU args:
> ... -cpu host,-x2apic -global kvm-pit.lost_tick_policy=discard ...
>
> When LAPIC works in xapic mode, both AVIC and PV_SEND_IPI feature
> can accelerate IPI operations for guest. However, the relationship
> between AVIC and PV_SEND_IPI feature is not sorted out.
>
> In logical, AVIC accelerates most of frequently IPI operations
> without VMM intervention, while the re-hooking of apic->send_IPI_xxx
> from PV_SEND_IPI feature masks out it. People can get confused
> if AVIC is enabled while getting lots of hypercall kvm_exits
> from IPI.
>
> In performance, benchmark tool
> https://lore.kernel.org/kvm/20171219085010.4081-1-ynorov@caviumnetworks.com/
> shows below results:
>
> Test env:
> CPU: AMD EPYC 7742 64-Core Processor
> 2 vCPUs pinned 1:1
> idle=poll
>
> Test result (average ns per IPI of lots of running):
> PV_SEND_IPI : 1860
> AVIC : 1390
>
> Besides, disscussions in https://lkml.org/lkml/2021/10/20/423
> do have some solid performance test results to this.
>
> This patch fixes this by masking out PV_SEND_IPI feature when
> AVIC is enabled in setting up of guest vCPUs' CPUID.
>
> Signed-off-by: Kele Huang <huangkele@bytedance.com>
> ---
> arch/x86/kvm/cpuid.c | 4 ++--
> arch/x86/kvm/svm/svm.c | 13 +++++++++++++
> 2 files changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
> index 2d70edb0f323..cc22975e2ac5 100644
> --- a/arch/x86/kvm/cpuid.c
> +++ b/arch/x86/kvm/cpuid.c
> @@ -194,8 +194,6 @@ static void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
> best->ecx |= XFEATURE_MASK_FPSSE;
> }
>
> - kvm_update_pv_runtime(vcpu);
> -
> vcpu->arch.maxphyaddr = cpuid_query_maxphyaddr(vcpu);
> vcpu->arch.reserved_gpa_bits = kvm_vcpu_reserved_gpa_bits_raw(vcpu);
>
> @@ -208,6 +206,8 @@ static void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
> /* Invoke the vendor callback only after the above state is updated. */
> static_call(kvm_x86_vcpu_after_set_cpuid)(vcpu);
>
> + kvm_update_pv_runtime(vcpu);
> +
> /*
> * Except for the MMU, which needs to do its thing any vendor specific
> * adjustments to the reserved GPA bits.
> diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
> index b36ca4e476c2..b13bcfb2617c 100644
> --- a/arch/x86/kvm/svm/svm.c
> +++ b/arch/x86/kvm/svm/svm.c
> @@ -4114,6 +4114,19 @@ static void svm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
> if (nested && guest_cpuid_has(vcpu, X86_FEATURE_SVM))
> kvm_request_apicv_update(vcpu->kvm, false,
> APICV_INHIBIT_REASON_NESTED);
> +
> + if (!guest_cpuid_has(vcpu, X86_FEATURE_X2APIC) &&
> + !(nested && guest_cpuid_has(vcpu, X86_FEATURE_SVM))) {
> + /*
> + * PV_SEND_IPI feature masks out AVIC acceleration to IPI.
> + * So, we do not expose PV_SEND_IPI feature to guest when
> + * AVIC is enabled.
> + */
> + best = kvm_find_cpuid_entry(vcpu, KVM_CPUID_FEATURES, 0);
> + if (best && enable_apicv &&
> + (best->eax & (1 << KVM_FEATURE_PV_SEND_IPI)))
> + best->eax &= ~(1 << KVM_FEATURE_PV_SEND_IPI);
> + }
Personally, I'd prefer this to be done in userspace (e.g. QEMU) as with
this patch it becomes very un-obvious why in certain cases some feature
bits are missing. This also breaks migration from KVM pre-patch to KVM
post-patch with e.g. KVM_CAP_ENFORCE_PV_FEATURE_CPUID: the feature will
just disappear from underneath the guest.
What we don't have in KVM is something like KVM_GET_RECOMMENDED_CPUID
at least for KVM PV/Hyper-V features. We could've made it easier for
userspace to make 'default' decisions.
> }
> init_vmcb_after_set_cpuid(vcpu);
> }
--
Vitaly
next prev parent reply other threads:[~2021-11-08 10:45 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-08 9:59 [RFC] KVM: x86: SVM: don't expose PV_SEND_IPI feature with AVIC Kele Huang
2021-11-08 10:30 ` Paolo Bonzini
2021-11-08 11:08 ` Maxim Levitsky
2021-11-08 11:14 ` zhenwei pi
2021-11-08 11:18 ` Paolo Bonzini
2021-11-16 2:48 ` Wanpeng Li
2021-11-16 2:56 ` zhenwei pi
2021-11-16 9:06 ` Chao Gao
2021-11-16 9:30 ` [External] " 黄科乐
2021-11-16 9:30 ` Wanpeng Li
[not found] ` <CAKUug92xp7mU_KB66jGtdYRhgQpgfCm67r+3kMOMdbrGOrTQcA@mail.gmail.com>
2021-11-16 15:57 ` [External] " Sean Christopherson
2021-11-08 10:45 ` Vitaly Kuznetsov [this message]
2021-11-16 2:04 ` Wanpeng Li
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=87ilx3j58x.fsf@vitty.brq.redhat.com \
--to=vkuznets@redhat.com \
--cc=bp@alien8.de \
--cc=chaiwen.cc@bytedance.com \
--cc=dave.hansen@linux.intel.com \
--cc=dengliang.1214@bytedance.com \
--cc=hpa@zytor.com \
--cc=huangkele@bytedance.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=pizhenwei@bytedance.com \
--cc=seanjc@google.com \
--cc=tglx@linutronix.de \
--cc=wanpengli@tencent.com \
--cc=x86@kernel.org \
--cc=xieyongji@bytedance.com \
/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.