[PATCH v5 07/69] KVM: arm64: nv: Introduce nested virtualization VCPU feature

Marc Zyngier maz at kernel.org
Thu Jan 13 06:24:47 PST 2022


On Thu, 13 Jan 2022 14:10:39 +0000,
Alexandru Elisei <alexandru.elisei at arm.com> wrote:
> 
> Hi Marc,
> 
> On Mon, Nov 29, 2021 at 08:00:48PM +0000, Marc Zyngier wrote:
> > From: Christoffer Dall <christoffer.dall at arm.com>
> > 
> > Introduce the feature bit and a primitive that checks if the feature is
> > set behind a static key check based on the cpus_have_const_cap check.
> > 
> > Checking nested_virt_in_use() on systems without nested virt enabled
> > should have neglgible overhead.
> > 
> > We don't yet allow userspace to actually set this feature.
> > 
> > Signed-off-by: Christoffer Dall <christoffer.dall at arm.com>
> > Signed-off-by: Marc Zyngier <maz at kernel.org>
> > ---
> >  arch/arm64/include/asm/kvm_nested.h | 14 ++++++++++++++
> >  arch/arm64/include/uapi/asm/kvm.h   |  1 +
> >  2 files changed, 15 insertions(+)
> >  create mode 100644 arch/arm64/include/asm/kvm_nested.h
> > 
> > diff --git a/arch/arm64/include/asm/kvm_nested.h b/arch/arm64/include/asm/kvm_nested.h
> > new file mode 100644
> > index 000000000000..1028ac65a897
> > --- /dev/null
> > +++ b/arch/arm64/include/asm/kvm_nested.h
> > @@ -0,0 +1,14 @@
> > +/* SPDX-License-Identifier: GPL-2.0 */
> > +#ifndef __ARM64_KVM_NESTED_H
> > +#define __ARM64_KVM_NESTED_H
> > +
> > +#include <linux/kvm_host.h>
> > +
> > +static inline bool nested_virt_in_use(const struct kvm_vcpu *vcpu)
> > +{
> > +	return (!__is_defined(__KVM_NVHE_HYPERVISOR__) &&
> > +		cpus_have_final_cap(ARM64_HAS_NESTED_VIRT) &&
> > +		test_bit(KVM_ARM_VCPU_HAS_EL2, vcpu->arch.features));
> 
> kvm_vcpu_init_nested() checks the ARM64_HAS_NESTED_VIRT cap before setting
> the features bit, so I guess you can drop this check here if you're
> interested in correctness.
> 
> But the reason the cap check done is performance, right? Same with the NVHE
> define.

Exactly. The capability check allows us to use a static key to bypass
the test_bit() when NV isn't enable, which is 100% of our use cases.
Given that this checked fairly often on some of the fast paths, it is
worth doing it.

The NVHE check goes even further by allowing some dead code removal in
the nVHE-specific code, which cannot use NV by construction.

Thanks,

	M.

-- 
Without deviation from the norm, progress is not possible.



More information about the linux-arm-kernel mailing list