[PATCH v5 0/2] KVM: arm64: mixed-width check should be skipped for uninitialized vCPUs
Reiji Watanabe
reijiw at google.com
Sun Mar 20 22:08:02 PDT 2022
KVM allows userspace to configure either all EL1 32bit or 64bit vCPUs
for a guest. At vCPU reset, vcpu_allowed_register_width() checks
if the vcpu's register width is consistent with all other vCPUs'.
Since the checking is done even against vCPUs that are not initialized
(KVM_ARM_VCPU_INIT has not been done) yet, the uninitialized vCPUs
are erroneously treated as 64bit vCPU, which causes the function to
incorrectly detect a mixed-width VM.
This series will fix this problem by introducing a new VM flag that
indicates the guest needs to be configured with all 32bit or 64bit
vCPUs and checking vcpu's register width against the new flag at
the vcpu's KVM_ARM_VCPU_INIT (instead of against other vCPUs'
register width).
Patch-1 introduces KVM_ARCH_FLAG_EL1_32BIT and
KVM_ARCH_FLAG_REG_WIDTH_CONFIGURED bits for kvm->arch.flags and
uses them to check vcpu's register width to fix the problem.
Patch-2 introduces a selftest that can test non-mixed-width vCPUs (all
64bit vCPUs or all 32bit vcPUs) can be configured, and mixed-width
vCPUs cannot be configured.
The series is based on kvmarm/next's at tag: kvmarm-5.18.
v5:
- Rebase to kvmarm/next (and drop the patch-1 "KVM: arm64: Generalise
VM features into a set of flags")
- Use kernel-doc style comments for kvm_set_vm_width() [Oliver]
- Change kvm_set_vm_width() to use if/else instead of a ternary
operator for KVM_ARCH_FLAG_EL1_32BIT check [Oliver]
v4: https://lore.kernel.org/all/20220314061959.3349716-1-reijiw@google.com/
- Use different implementation of vcpu_el1_is_32bit() depending on
the context. [Marc]
- Rename kvm_register_width_check_or_init() to kvm_set_vm_width(), and
call it from kvm_rest_vcpu() instead of from kvm_vcpu_set_target()
- Remove vcpu_allowed_register_width(), and does the same checking
in kvm_set_vm_width() instead.
v3: https://lore.kernel.org/all/20220303035408.3708241-1-reijiw@google.com/
- Introduced 'flags' to kvm_arch, and use bits of the flags for
a set of booleans for VM feature.
- Changed 'el1_reg_width' to two bits of 'flags' of kvm_arch.
v2: https://lore.kernel.org/all/20220118041923.3384602-1-reijiw@google.com/
- Introduced 'el1_reg_width' for kvm_arch and use it to check vcpu's
register width against the flag at the vcpu's KVM_ARM_VCPU_INIT.
v1: https://lore.kernel.org/all/20220110054042.1079932-1-reijiw@google.com/
[1] https://lore.kernel.org/all/20210715163159.1480168-2-maz@kernel.org/
Reiji Watanabe (2):
KVM: arm64: mixed-width check should be skipped for uninitialized
vCPUs
KVM: arm64: selftests: Introduce vcpu_width_config
arch/arm64/include/asm/kvm_emulate.h | 27 ++--
arch/arm64/include/asm/kvm_host.h | 10 ++
arch/arm64/kvm/reset.c | 65 ++++++---
tools/testing/selftests/kvm/.gitignore | 1 +
tools/testing/selftests/kvm/Makefile | 1 +
.../selftests/kvm/aarch64/vcpu_width_config.c | 125 ++++++++++++++++++
6 files changed, 199 insertions(+), 30 deletions(-)
create mode 100644 tools/testing/selftests/kvm/aarch64/vcpu_width_config.c
--
2.35.1.894.gb6a874cedc-goog
More information about the linux-arm-kernel
mailing list