Message ID | 20210916181510.963449-1-oupton@google.com (mailing list archive) |
---|---|
Headers | show |
Series | KVM: arm64: Add idempotent controls to migrate guest counter | expand |
Hi Oliver, This looks interesting, I am going to try to do my best to review the series. I haven't followed the patches until this version, so I might be missing part of the context when I post my comments. Thanks, Alex On 9/16/21 19:15, Oliver Upton wrote: > Currently, on KVM/arm64, we only allow a VMM to migrate the guest's > virtual counter by-value. Saving and restoring the counter by value is > problematic in the fact that the recorded state is not idempotent. > Furthermore, we obfuscate from userspace the fact that the architecture > actually provides offset-based controls. > > Another issue is that KVM/arm64 doesn't provide userspace with the > controls of the physical counter-timer. This series aims to address both > issues by adding offset-based controls for the virtual and physical > counters. > > Patches 1-2 are refactor changes required to provide offset controls to > userspace and putting in some generic plumbing to use for both physical > and virtual offsets. > > Patch 3 is a minor refactor, creating a helper function to get the > number of timer registers for a particular vCPU. > > Patch 4 exposes a vCPU's virtual offset through the KVM_*_ONE_REG > ioctls. When NV support is added to KVM, CNTVOFF_EL2 will be considered > a guest system register. So, it is safe to expose it now through that > ioctl. > > Patch 5 adds a cpufeature bit to detect 'full' ECV implementations, > providing EL2 with the ability to offset the physical counter-timer. > > Patch 6 exposes a vCPU's physical offset as a vCPU device attribute. > This is deliberate, as the attribute is not architectural; KVM uses this > attribute to track the host<->guest offset. > > Patch 7 is a prepatory change for the sake of physical offset emulation, > as counter-timer traps must be configured separately for each vCPU. > > Patch 8 allows non-ECV hosts to support the physical offset vCPU device > attribute, by trapping and emulating the physical counter registers. > > This series was tested on an Ampere Mt. Jade system (non-ECV, VHE and > nVHE). I did not test this on the FVP, as I need to really figure out > tooling for it on my workstation. > > Applies cleanly to v5.15-rc1 > > v7: http://lore.kernel.org/r/20210816001217.3063400-1-oupton@google.com > > v7 -> v8: > - Only use ECV if !VHE > - Only expose CNTVOFF_EL2 register to userspace with opt-in > - Refer to the direct_ptimer explicitly > > Oliver Upton (8): > KVM: arm64: Refactor update_vtimer_cntvoff() > KVM: arm64: Separate guest/host counter offset values > KVM: arm64: Make a helper function to get nr of timer regs > KVM: arm64: Allow userspace to configure a vCPU's virtual offset > arm64: cpufeature: Enumerate support for FEAT_ECV >= 0x2 > KVM: arm64: Allow userspace to configure a guest's counter-timer > offset > KVM: arm64: Configure timer traps in vcpu_load() for VHE > KVM: arm64: Emulate physical counter offsetting on non-ECV systems > > Documentation/arm64/booting.rst | 7 + > Documentation/virt/kvm/api.rst | 23 +++ > Documentation/virt/kvm/devices/vcpu.rst | 28 ++++ > arch/arm64/include/asm/kvm_host.h | 3 + > arch/arm64/include/asm/sysreg.h | 5 + > arch/arm64/include/uapi/asm/kvm.h | 2 + > arch/arm64/kernel/cpufeature.c | 10 ++ > arch/arm64/kvm/arch_timer.c | 196 +++++++++++++++++++++--- > arch/arm64/kvm/arm.c | 9 +- > arch/arm64/kvm/guest.c | 28 +++- > arch/arm64/kvm/hyp/include/hyp/switch.h | 32 ++++ > arch/arm64/kvm/hyp/nvhe/timer-sr.c | 11 +- > arch/arm64/tools/cpucaps | 1 + > include/clocksource/arm_arch_timer.h | 1 + > include/kvm/arm_arch_timer.h | 14 +- > include/uapi/linux/kvm.h | 1 + > 16 files changed, 337 insertions(+), 34 deletions(-) >