[PATCH v3 00/18] KVM: arm64: Rework timer offsetting for fun and profit

Veith, Simon sveith at amazon.de
Tue Mar 28 22:41:07 PDT 2023


Hello Marc,

thanks again for your proposal.

On Fri, 2023-03-24 at 14:46 +0000, Marc Zyngier wrote:
> This series aims at satisfying multiple goals:
> 
> - allow a VMM to atomically restore a timer offset for a whole VM
>   instead of updating the offset each time a vcpu get its counter
>   written
> 
> - allow a VMM to save/restore the physical timer context, something
>   that we cannot do at the moment due to the lack of offsetting
> 
> - provide a framework that is suitable for NV support, where we get
>   both global and per timer, per vcpu offsetting, and manage
>   interrupts in a less braindead way.
> 
> We fix a couple of issues along the way, both from a stylistic and
> correctness perspective. This results in a new per VM KVM API that
> allows a global offset to be set at any point in time, overriding
> both
> of the timer counter writebacks.
> 
> We also take this opportunity to rework the way IRQs are associated
> with timers, something that was always a bit dodgy. This relies on a
> new lock, which should disappear once Oliver's lock ordering series
> is
> merged (we can reuse the config_lock for this).
> 
> This has been tested with nVHE, VHE and NV. I do not have access to
> CNTPOFF-aware HW, but Colton managed to give it a go. Note that the
> NV patches in this series are here to give a perspective on how this
> gets used.
> 
> I've updated the arch_timer selftest to allow an offset to be
> provided
> from the command line, and fixed a couple of glaring issues along the
> way.
> 
> Note that this is at best 6.4 material. I have a branch stashed at
> [0]
> and based on 6.3-rc3, as well as a minimal example of the use of the
> API at [3] based on kvmtool.
> 
> Simon: I'd appreciate some feedback as whether this change fits your
> requirements, given that you brought this up the first place.

The interface looks good to me. I have yet to deliver on my promise to
test your patch series with our userspace; I am on leave this week, but
I'll give your latest iteration a go next week.

Thanks
Simon

> Thanks,
> 
>         M.
> 
> * From v2 [2]:
> 
>   - Fixed 32bit handling of the physical counter when the offset is
>     non-zero
> 
>   - Dropped unused -O option from the selftest
> 
>   - Added lockdep_assert_held() to (un)lock_all_vcpus()
> 
>   - Reordered the last two patches
> 
>   - Added Colton's RBs, with thanks
> 
>   - Dropped the initial patch which has been merged
> 
>   - Rebased on 6.3-rc3
> 
> * From v1 [1]:
> 
>   - Switched from a dual offset to a single one which gets applied to
>     both virtual and physical counters. Which means that NV doesn't
>     behave oddly anymore by ignoring the virtual offset.
> 
>   - Some cosmetic repainting of the UAPI symbols
> 
>   - Added patches to rework the IRQ mapping to timers
> 
>   - Patch #1 on its way to Paolo
> 
>   - Rebased on 6.3-rc1
> 
> [0]
> https://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms.git/log/?h=kvm-arm64/timer-vm-offsets
> [1] https://lore.kernel.org/r/20230216142123.2638675-1-maz@kernel.org
> [2] https://lore.kernel.org/r/20230313124837.2264882-5-maz@kernel.org
> [3]
> https://git.kernel.org/pub/scm/linux/kernel/git/maz/kvmtool.git/commit/?h=zero-offset&id=3b1253073ee57c0d92baf7b214362829b487b8d5
> 
> Marc Zyngier (18):
>   KVM: arm64: timers: Use a per-vcpu, per-timer accumulator for
>     fractional ns
>   arm64: Add CNTPOFF_EL2 register definition
>   arm64: Add HAS_ECV_CNTPOFF capability
>   KVM: arm64: timers: Use CNTPOFF_EL2 to offset the physical timer
>   KVM: arm64: timers: Allow physical offset without CNTPOFF_EL2
>   KVM: arm64: Expose {un,}lock_all_vcpus() to the rest of KVM
>   KVM: arm64: timers: Allow userspace to set the global counter
> offset
>   KVM: arm64: timers: Allow save/restoring of the physical timer
>   KVM: arm64: timers: Rationalise per-vcpu timer init
>   KVM: arm64: timers: Abstract per-timer IRQ access
>   KVM: arm64: timers: Move the timer IRQs into arch_timer_vm_data
>   KVM: arm64: Abstract the number of valid timers per vcpu
>   KVM: arm64: Document KVM_ARM_SET_CNT_OFFSETS and co
>   KVM: arm64: nv: timers: Add a per-timer, per-vcpu offset
>   KVM: arm64: nv: timers: Support hyp timer emulation
>   KVM: arm64: selftests: Add physical timer registers to the sysreg
> list
>   KVM: arm64: selftests: Deal with spurious timer interrupts
>   KVM: arm64: selftests: Augment existing timer test to handle
> variable
>     offset
> 
>  Documentation/virt/kvm/api.rst                |  38 ++
>  arch/arm64/include/asm/kvm_host.h             |  13 +
>  arch/arm64/include/asm/sysreg.h               |   2 +
>  arch/arm64/include/uapi/asm/kvm.h             |  11 +
>  arch/arm64/kernel/cpufeature.c                |  11 +
>  arch/arm64/kvm/arch_timer.c                   | 539 ++++++++++++++--
> --
>  arch/arm64/kvm/arm.c                          |  53 ++
>  arch/arm64/kvm/guest.c                        |  29 +-
>  arch/arm64/kvm/hyp/nvhe/timer-sr.c            |  18 +-
>  arch/arm64/kvm/hypercalls.c                   |   2 +-
>  arch/arm64/kvm/sys_regs.c                     |   9 +
>  arch/arm64/kvm/trace_arm.h                    |   6 +-
>  arch/arm64/kvm/vgic/vgic-kvm-device.c         |  38 --
>  arch/arm64/kvm/vgic/vgic.c                    |  15 +
>  arch/arm64/kvm/vgic/vgic.h                    |   3 -
>  arch/arm64/tools/cpucaps                      |   1 +
>  arch/arm64/tools/sysreg                       |   4 +
>  include/clocksource/arm_arch_timer.h          |   1 +
>  include/kvm/arm_arch_timer.h                  |  36 +-
>  include/kvm/arm_vgic.h                        |   1 +
>  include/uapi/linux/kvm.h                      |   3 +
>  .../selftests/kvm/aarch64/arch_timer.c        |  56 +-
>  .../selftests/kvm/aarch64/get-reg-list.c      |   5 +-
>  23 files changed, 690 insertions(+), 204 deletions(-)
> 
> --
> 2.34.1
> 




Amazon Development Center Germany GmbH
Krausenstr. 38
10117 Berlin
Geschaeftsfuehrung: Christian Schlaeger, Jonathan Weiss
Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B
Sitz: Berlin
Ust-ID: DE 289 237 879




More information about the linux-arm-kernel mailing list