On 18/04/2024 20:34, David Woodhouse wrote:
From: Jack Allister jalliste@amazon.com
A VM's KVM/PV clock has an inherent relationship to its TSC (guest). When either the host system live-updates or the VM is live-migrated this pairing of the two clock sources should stay the same.
In reality this is not the case without some correction taking place. Two new IOCTLs (KVM_GET_CLOCK_GUEST/KVM_SET_CLOCK_GUEST) can be utilized to perform a correction on the PVTI (PV time information) structure held by KVM to effectively fixup the kvmclock_offset prior to the guest VM resuming in either a live-update/migration scenario.
This test proves that without the necessary fixup there is a perceived change in the guest TSC & KVM/PV clock relationship before and after a LU/ LM takes place.
The following steps are made to verify there is a delta in the relationship and that it can be corrected:
- PVTI is sampled by guest at boot (let's call this PVTI0).
- Induce a change in PVTI data (KVM_REQ_MASTERCLOCK_UPDATE).
- PVTI is sampled by guest after change (PVTI1).
- Correction is requested by usermode to KVM using PVTI0.
- PVTI is sampled by guest after correction (PVTI2).
The guest the records a singular TSC reference point in time and uses it to calculate 3 KVM clock values utilizing the 3 recorded PVTI prior. Let's call each clock value CLK[0-2].
In a perfect world CLK[0-2] should all be the same value if the KVM clock & TSC relationship is preserved across the LU/LM (or faked in this test), however it is not.
A delta can be observed between CLK0-CLK1 due to KVM recalculating the PVTI (and the inaccuracies associated with that). A delta of ~3500ns can be observed if guest TSC scaling to half host TSC frequency is also enabled, where as without scaling this is observed at ~180ns.
With the correction it should be possible to achieve a delta of ±1ns.
An option to enable guest TSC scaling is available via invoking the tester with -s/--scale-tsc.
Example of the test output below:
- selftests: kvm: pvclock_test
- scaling tsc from 2999999KHz to 1499999KHz
- before=5038374946 uncorrected=5038371437 corrected=5038374945
- delta_uncorrected=3509 delta_corrected=1
Signed-off-by: Jack Allister jalliste@amazon.com Signed-off-by: David Woodhouse dwmw@amazon.co.uk CC: Paul Durrant paul@xen.org CC: Dongli Zhang dongli.zhang@oracle.com
tools/testing/selftests/kvm/Makefile | 1 + .../selftests/kvm/x86_64/pvclock_test.c | 192 ++++++++++++++++++ 2 files changed, 193 insertions(+) create mode 100644 tools/testing/selftests/kvm/x86_64/pvclock_test.c
Reviewed-by: Paul Durrant paul@xen.org