From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A20B93BE161 for ; Fri, 31 Jul 2026 23:38:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.200 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785541119; cv=none; b=Pk+geQQrX8aShDqWqktgJb1cL3cAYAjrx68mnZKh242bmEqfMZcJ7uKK3qCuKzMHp6s/DUBEfxMyMAOOTZt+TigUylNnohCxzbX1fi+8aA9hXsIq2bzwHbiC5q8I4tVVjRJfKxTe1qASGe631n9bpKevog3xcrElRZ7pOPedlmU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785541119; c=relaxed/simple; bh=zKG0iS70PV1ZsDDU0ojNP7wKsx3DKqaKvtYhgGjhqec=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=maItTNNKySmDZesXkqexGkLLxRwnQ8qMpmWVcxGeLobQ5MnMRLwB31E09n1F/AqijRfedvTDMKf9YjVrOp42b/BUWdUFbkr3zPKsq/al/1V7QWRD7uhmSX47UxkERQmcKdOD7A88ktbv/UhzNzOvQkPVT/HMG2BwgyI+GukoYT4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=W1vKjvQW; arc=none smtp.client-ip=209.85.210.200 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="W1vKjvQW" Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-8486ffba174so2723301b3a.1 for ; Fri, 31 Jul 2026 16:38:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1785541117; x=1786145917; darn=vger.kernel.org; h=content-transfer-encoding:content-type:cc:to:from:subject :message-id:references:mime-version:in-reply-to:date:from:to:cc :subject:date:message-id:reply-to:content-type; bh=dmKsJOviftvACUGPABBN88S+tJ91thYPhBWQcoJdx18=; b=W1vKjvQWU2LANf0hil7JAJKIzwtCO2qQsxWxRYPJFktMEYoEosVjNuPvQOlgo+yN9/ 9Efpz3ACwONT5oj34ijQIr2zrNOzFUt4rGxNkk60pwlO+u7i7ffdexxCEMoAu5wHU8V3 zSYEsX3fR7iSQ3V2wDi6NUbH1MML9uI9P+KstO/dBj6nLwyJMr1hj0fLNUxQOqvAp3iY +2MOL7MJnmK0fI8Qg2svBwS8be/XAIq3dym2AI6Bojk/7SaU4IG0ju0nN+ulP7vGKdGA s662rLvG7wrLlDQYX7IxYNoaznEWfUsgM2VTbRVLusuNNfL6/ngs6/HhtedAOSKMdZoc guHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785541117; x=1786145917; h=content-transfer-encoding:content-type:cc:to:from:subject :message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=dmKsJOviftvACUGPABBN88S+tJ91thYPhBWQcoJdx18=; b=e6azDWalKSYYCkEZfuPCYjBRHERiGXrn55aVDQF9QJtzztPOhLxzN+OYNyUh+gSgb5 qEmK1qMMd5oKdfzBSgpAvc3G2IpZDeV1nLP2kLL/wCRPwD3MzxgWxp+w1zA3cdRCy6nK 8a/nLonSKAcBAya64YF2vAnaXknjHGdyPSUFM1No7+Nf1QhNricAEyzdNNZgulQefMih 4pYkoiO5Xlao+MJIFqEqtoRr+RNJIYiNeTid4wCL5jahdDIrREz6n/ljBsv6SoMX9b5Z yYkRPm5lOia5xd8/cFYK/zTWxI6NxLB0jMxdKtqrvOCjsVvlfZb4V/lBdfRvxzSMjUB3 FQaQ== X-Forwarded-Encrypted: i=1; AHgh+RqQBaHimDiFOxAMTTa9uP0CanA5gjdzqU7VAZ4cQ7wckgdhyZsS8tBtTe/gfAnmkQRWSqE55FP0ptg=@vger.kernel.org X-Gm-Message-State: AOJu0Yz33tCQIcQ7/MkYvwYBxEAuw5kPLa2ycrlJNRILF1PDpTW+QSYJ mneaYFNnOuhREum6HFPCUbSgiucIgt7Bp7wpP+LZmWr8dD8t4csxXhi5MforVGsHYQyU+FOP0W8 yq5/Nhg== X-Received: from pful5.prod.google.com ([2002:a05:6a00:1405:b0:847:a85b:6c23]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:6c8f:b0:847:8b0f:2508 with SMTP id d2e1a72fcca58-84ee47789c4mr1324782b3a.13.1785541116639; Fri, 31 Jul 2026 16:38:36 -0700 (PDT) Date: Fri, 31 Jul 2026 16:38:36 -0700 In-Reply-To: <20260728144954.355376-35-dwmw2@infradead.org> Precedence: bulk X-Mailing-List: linux-doc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260728144954.355376-1-dwmw2@infradead.org> <20260728144954.355376-35-dwmw2@infradead.org> Message-ID: Subject: Re: [PATCH v7 34/36] KVM: selftests: Add master clock offset test From: Sean Christopherson To: David Woodhouse Cc: Paolo Bonzini , Jonathan Corbet , Shuah Khan , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Vitaly Kuznetsov , Juergen Gross , Boris Ostrovsky , Paul Durrant , Jonathan Cameron , Sascha Bischoff , Marc Zyngier , Joey Gouly , Jack Allister , Dongli Zhang , joe.jin@oracle.com, kvm@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, linux-kselftest@vger.kernel.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable On Tue, Jul 28, 2026, David Woodhouse wrote: > From: David Woodhouse >=20 > Verify that KVM master clock mode remains active when vCPUs have > different TSC offsets but the same frequency. Creates three vCPUs, > sets one to a different TSC value, and confirms: >=20 > - KVM_CLOCK_HOST_TSC is set (master clock active) > - KVM_CLOCK_TSC_STABLE IS set (master clock =E2=87=92 stable flag) > - PVCLOCK_TSC_STABLE_BIT is NOT set (offsets differ) >=20 > Signed-off-by: David Woodhouse > Assisted-by: Kiro (claude-opus-4.6-1m) > --- > tools/testing/selftests/kvm/Makefile.kvm | 1 + > .../kvm/x86/masterclock_offset_test.c | 180 ++++++++++++++++++ > 2 files changed, 181 insertions(+) > create mode 100644 tools/testing/selftests/kvm/x86/masterclock_offset_te= st.c >=20 > diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/sel= ftests/kvm/Makefile.kvm > index 95539deea266..f6027a35f790 100644 > --- a/tools/testing/selftests/kvm/Makefile.kvm > +++ b/tools/testing/selftests/kvm/Makefile.kvm > @@ -108,6 +108,7 @@ TEST_GEN_PROGS_x86 +=3D x86/pmu_event_filter_test > TEST_GEN_PROGS_x86 +=3D x86/private_mem_conversions_test > TEST_GEN_PROGS_x86 +=3D x86/private_mem_kvm_exits_test > TEST_GEN_PROGS_x86 +=3D x86/pvclock_test > +TEST_GEN_PROGS_x86 +=3D x86/masterclock_offset_test Keep these sorted alphabetically. > TEST_GEN_PROGS_x86 +=3D x86/pvclock_migration_test > TEST_GEN_PROGS_x86 +=3D x86/set_boot_cpu_id > TEST_GEN_PROGS_x86 +=3D x86/set_sregs_test > diff --git a/tools/testing/selftests/kvm/x86/masterclock_offset_test.c b/= tools/testing/selftests/kvm/x86/masterclock_offset_test.c > new file mode 100644 > index 000000000000..88e2bd2edab5 > --- /dev/null > +++ b/tools/testing/selftests/kvm/x86/masterclock_offset_test.c > @@ -0,0 +1,180 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * Test that KVM master clock mode works with different TSC offsets > + * as long as all vCPUs have the same TSC frequency. > + */ > +#include > +#include > + > +#include "test_util.h" > +#include "kvm_util.h" > +#include "processor.h" > + > +#include > + > +#define KVMCLOCK_GPA 0xc0000000ull > +#define TSC_OFFSET (1000000000ULL) > + > +static uint64_t pvclock_calc(struct pvclock_vcpu_time_info *pvti, uint64= _t guest_tsc) > +{ > + uint64_t delta =3D guest_tsc - pvti->tsc_timestamp; > + > + if (pvti->tsc_shift >=3D 0) > + delta <<=3D pvti->tsc_shift; > + else > + delta >>=3D -(int)pvti->tsc_shift; > + > + return pvti->system_time + ((__uint128_t)delta * pvti->tsc_to_system_mu= l >> 32); > +} > + > +static void guest_code(void) > +{ > + wrmsr(MSR_KVM_SYSTEM_TIME_NEW, KVMCLOCK_GPA | KVM_MSR_ENABLED); > + for (;;) > + GUEST_SYNC(0); > +} > + > +int main(void) > +{ > + struct kvm_vcpu *vcpus[3]; > + struct kvm_clock_data clock; > + struct pvclock_vcpu_time_info pvti[3]; > + struct kvm_vm *vm; > + uint64_t offset0, host_tsc, clk0, clk2; > + int i; > + > + TEST_REQUIRE(sys_clocksource_is_based_on_tsc()); > + > + vm =3D vm_create_with_vcpus(3, guest_code, vcpus); > + > + TEST_REQUIRE(!__vcpu_has_device_attr(vcpus[0], KVM_VCPU_TSC_CTRL, > + KVM_VCPU_TSC_OFFSET)); > + > + vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, > + KVMCLOCK_GPA, 1, > + vm_calc_num_guest_pages(VM_MODE_DEFAULT, > + getpagesize()), 0); > + virt_map(vm, KVMCLOCK_GPA, KVMCLOCK_GPA, > + vm_calc_num_guest_pages(VM_MODE_DEFAULT, getpagesize())); > + > + /* Get vCPU 0's default offset and set vCPU 2's offset higher */ > + vcpu_device_attr_get(vcpus[0], KVM_VCPU_TSC_CTRL, > + KVM_VCPU_TSC_OFFSET, &offset0); > + uint64_t offset2 =3D offset0 + TSC_OFFSET; > + vcpu_device_attr_set(vcpus[2], KVM_VCPU_TSC_CTRL, > + KVM_VCPU_TSC_OFFSET, &offset2); > + > + /* Run each vCPU to enable kvmclock (with offset already set) */ > + for (i =3D 0; i < 3; i++) { ARRAY_SIZE(vcpus) > + vcpu_run(vcpus[i]); > + TEST_ASSERT_KVM_EXIT_REASON(vcpus[i], KVM_EXIT_IO); > + } > + > + /* Check master clock is active */ > + memset(&clock, 0, sizeof(clock)); > + vm_ioctl(vm, KVM_GET_CLOCK, &clock); Provide an API. > + pr_info("KVM_GET_CLOCK flags: 0x%x\n", clock.flags); > + TEST_ASSERT(clock.flags & KVM_CLOCK_HOST_TSC, > + "Master clock should be active, flags=3D0x%x", clock.flags); > + TEST_ASSERT(clock.flags & KVM_CLOCK_TSC_STABLE, > + "KVM_CLOCK_TSC_STABLE should be set, flags=3D0x%x", clock.flags); > + > + /* Get per-vCPU pvclock in order 0, 2, 1 */ > + int order[] =3D {0, 2, 1}; Please don't declare variables in the middle code. Yes, it's now technical= ly possible thanks to all the guard() magic, but it's still against preferred = kernel style. Though this itself is probably a really, really good indication that this n= eeds to be split into multiple testcases. Maybe using TEST_F() and a custom fix= ture?