[RFC PATCH 0/6] KVM: arm64: Errata management for VM Live migration

Shameer Kolothum shameerali.kolothum.thodi at huawei.com
Fri Oct 11 00:50:47 PDT 2024


Hi,

On ARM64 platforms most of the errata workarounds are based on CPU
MIDR/REVIDR values and a number of these workarounds need to be
implemented by the Guest kernel as well. This creates a problem when
Guest needs to be migrated to a platform that differs in these
MIDR/REVIDR values even if the VMM can come up with a common minimum
feature list for the Guest using the recently introduced "Writable
ID registers" support.

(This is roughly based on a discussion I had with Marc and Oliver
at KVM forum. Marc outlined his idea for a solution and this is an
attempt to implement it. Thanks to both and I take all the blame
if this is nowhere near what is intended/required)

This RFC proposes a solution to handle the above issue by introducing
the following,

1. A new VM IOCTL,
   KVM_ARM_SET_MIGRN_TARGET_CPUS  _IOW(KVMIO,  0xb7, struct kvm_arm_migrn_cpus)
   This can be used by the userspace(VMM) to set the target CPUs the
   Guest will run in its lifetime. See patch #2
2. Add hypercall support for Guest kernel to retrieve any migration
   errata bitmap(ARM_SMCCC_VENDOR_HYP_KVM_MIGRN_ERRATA)
   The above will return the bitmaps in R0-R3 registers. See patch #4
3. The "capability" field in struct arm64_cpu_capabilities is a generated
   one at present and may get renumbered or reordered. Hence, we can't use
   this directly for migration errata bitmaps. Instead, introduced
   "migartion_safe_cap", which has to be set statically for any
   erratum that needs to be enabled and is safe for migration
   purposes. See patches 3 & 6.
4. Rest of the patches includes the plumbing required to populate the
   errata bitmap based on the target CPUs set by the VMM and update the
   system_cap based on it.

ToDos:-
  -We still need a way to  handle the error in setting the invariant
   registers(MIDR/REVIDR/AIDR) during Guest migration. Perhaps we can
   handle it in userspace?
-  Possibly we could do better to avoid the additional "migartion_safe_cap" use.
   Suggestions welcome.
  -There are errata that require more than MIDR/REVIDR, eg: CTR_EL0.
   How to handle those?
  -Check for locking requirements if any.

This is lightly tested on a HiSilicon ARM64 platform.

Please take a look and let me know your thoughts.

Thanks,
Shameer

Shameer Kolothum (6):
  arm64: Modify callback matches() fn to take a target info
  KVM: arm64: Add support for VMM to set migration target
  KVM: arm64: Introduce a helper to retrieve errata
  KVM: arm64: Add hypercall support for retrieving migration errata
    bitmap
  arm64: Use hypercall to check for any migration related errata
  arm64: errata: Set migration_safe_cap for MIDR based errata

 arch/arm64/include/asm/cpu_migrn_errata.h |  42 +++++++
 arch/arm64/include/asm/cpufeature.h       |  15 ++-
 arch/arm64/include/asm/kvm_host.h         |   3 +
 arch/arm64/include/asm/paravirt.h         |   4 +
 arch/arm64/include/asm/spectre.h          |   8 +-
 arch/arm64/include/uapi/asm/kvm.h         |  13 ++
 arch/arm64/kernel/cpu_errata.c            | 113 ++++++++++++++----
 arch/arm64/kernel/cpufeature.c            | 138 +++++++++++++++-------
 arch/arm64/kernel/paravirt.c              |  18 +++
 arch/arm64/kernel/proton-pack.c           |  13 +-
 arch/arm64/kvm/arm.c                      |  38 ++++++
 arch/arm64/kvm/hypercalls.c               |  20 ++++
 include/linux/arm-smccc.h                 |   8 +-
 include/uapi/linux/kvm.h                  |   2 +
 14 files changed, 361 insertions(+), 74 deletions(-)
 create mode 100644 arch/arm64/include/asm/cpu_migrn_errata.h

-- 
2.45.2




More information about the linux-arm-kernel mailing list