From nobody Sun Feb 8 15:30:31 2026 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6D2F127732; Thu, 15 Jan 2026 20:37:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.177.32 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768509429; cv=none; b=qPTlH3tqKvYAUOvC1KQolkRiNwDvTJmhaIPdCyi2bq+I3DZb99x7HAwOJC0u8oWRywmQWe6p1UhdsONV3238atB8YKU+HJieUncTEYLg4iiyv172O3Shfy2rCvuq2wqYPs9tKDTVIOryfFCqZuVPqW/erj5wcgeJCWyhfnSgELg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768509429; c=relaxed/simple; bh=x9drjpNdk0OcwrrATaj/vALUYVz/ueJrvGK4EhONfYU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MrIxaNsdmmvj5LELDbLVp+Fyl3Z3fnKPwaWaTiErzdNXS5oudHZg4r2eikVe4PxtdqsMub+gwSTbd9/hQQxQUTmjSj6K3K4092BWlFJMYswRhJPZ01yMzFWV3Nw5MVDxy6xt2lIhNHOQ01layTf9fn4D3dnlxgaQoBkR9wc/RaM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=sUw/reuJ; arc=none smtp.client-ip=205.220.177.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="sUw/reuJ" Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 60FH5a2H1360843; Thu, 15 Jan 2026 20:36:02 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=corp-2025-04-25; bh=2bFhq W+1koXRCrousnKYAoJXdN67c6lKmOJvXkEhZSs=; b=sUw/reuJ5L2PnUHb0JBU2 k6b377QShm0bKj0+1BVlw9ZjDbIi6f8EJtwkCe3yiAj9XNvsD/w3gLkDCcR0ePEm AlJcvnmOXzeZo2xc2NBlSu41vqADIzOSDcH1wAiYCYa+a8pYE59XeT0XGpC9pyLs nvv2h5ewqrD2QsHHaIpkxjgnRXzGjvaB57m8yHmSgQMqKgx8uQjFNxBXRdq4oM65 dqkx/Pcha8iHZOGKXk+Ds04f7isrtir9Tx/nBhJcCZP2D2jeoD4L5Uolc2+t9i+M FC0HoqmuNvvZsuu0B01Va/bYD/rMQxVD2ujJtnh1mfzEVt50WHg8KOQvLknqaUHw Q== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4bp5vp3v8a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 15 Jan 2026 20:36:01 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 60FKIlS4034710; Thu, 15 Jan 2026 20:36:00 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4bkd7bsw2p-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 15 Jan 2026 20:36:00 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 60FKXKQP010408; Thu, 15 Jan 2026 20:36:00 GMT Received: from localhost.localdomain (ca-dev80.us.oracle.com [10.211.9.80]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTP id 4bkd7bsw14-2; Thu, 15 Jan 2026 20:35:59 +0000 From: Dongli Zhang To: kvm@vger.kernel.org Cc: seanjc@google.com, pbonzini@redhat.com, dwmw2@infradead.org, dwmw@amazon.co.uk, paul@xen.org, tglx@kernel.org, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, linux-kernel@vger.kernel.org, joe.jin@oracle.com, dongli.zhang@oracle.com Subject: [PATCH 1/3] KVM: x86: Fix compute_guest_tsc() to cope with negative delta Date: Thu, 15 Jan 2026 12:22:29 -0800 Message-ID: <20260115202256.119820-2-dongli.zhang@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260115202256.119820-1-dongli.zhang@oracle.com> References: <20260115202256.119820-1-dongli.zhang@oracle.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2026-01-15_06,2026-01-15_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 mlxscore=0 suspectscore=0 mlxlogscore=999 bulkscore=0 malwarescore=0 phishscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2512120000 definitions=main-2601150161 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTE1MDE2MSBTYWx0ZWRfX4XWGV2aWTQFV QGJPeat/4rN0rh0uuOTl6NZFAcg/uY+x7KXjU9oiD7RSRChOIwSqLvQ0fxPR1y208RZ5QUQhMFZ ZHCJJu9bXvYzv97szi2qbJPg3+gMC2p6cyf52U+U8pCJA1hqHArjIaCyJ/uzhPH2ps4gtNYtIXS FDZRcbxN3RMTnXeDK20wdoBkLJP/y87U9i+PznW08+YGGL3jGsQc+stHFR9vIBPeL5sxqvkjxEO g8qeDgs5rK6cNBnuRo5roETpUhTIl6SugyBX43HpVcyd1BfmSC4EnYtNknCy3g/5MKji0lDRqk9 6bpuBlKDZo/Qf3uVA6a9qi+S1HYmx+cyQWES0rNm8i/elbTmwEEghlJv42g5xaGgBYonwj5xMrk a3yEHvyID5wcWl61NhyV2z6KA1w3UbnG3g8PtDliUmtiH6BikEucsCtpdQyXlzFzjvJFYH2eHo7 quSEXyfHwFbS816fGHQ== X-Proofpoint-GUID: s9_OY21XVOVNIEobCpbNoF03Q21k6tVY X-Authority-Analysis: v=2.4 cv=aZtsXBot c=1 sm=1 tr=0 ts=69694fb1 b=1 cx=c_pps a=WeWmnZmh0fydH62SvGsd2A==:117 a=WeWmnZmh0fydH62SvGsd2A==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=JfrnYn6hAAAA:8 a=pBOR-ozoAAAA:8 a=yPCof4ZbAAAA:8 a=eS-YMVMKI1Vx346kp8kA:9 a=1CNFftbPRP8L7MoqJWF3:22 X-Proofpoint-ORIG-GUID: s9_OY21XVOVNIEobCpbNoF03Q21k6tVY Content-Type: text/plain; charset="utf-8" From: David Woodhouse The upcoming patches will minimize the chances of updating the master clock data. Unfortunately, this may cause issues in compute_guest_tsc(). Since the KVM clock reference point in master_kernel_ns might actually be *earlier* than the reference point used for the guest TSC (vcpu->last_tsc_nsec), this might lead to a negative delta to be passed to pvclock_scale_delta(). Fix the compute_guest_tsc() function to cope with negative numbers. Signed-off-by: David Woodhouse Link: https://lore.kernel.org/all/20240522001817.619072-11-dwmw2@infradead.= org/ [Dongli: copy relevant code from above link and modify changelog] Signed-off-by: Dongli Zhang --- This a partial copy of "[RFC PATCH v3 10/21] KVM: x86: Fix software TSC upscaling in kvm_update_guest_time()", as Sean suggested, "Please do this in a separate patch. There's no need to squeeze it in here, and this change is complex/subtle enough as it is.", and David's authorship is preserved. arch/x86/kvm/x86.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 63afdb6bb078..5e7418cfd0af 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -2581,10 +2581,19 @@ static int kvm_set_tsc_khz(struct kvm_vcpu *vcpu, u= 32 user_tsc_khz) =20 static u64 compute_guest_tsc(struct kvm_vcpu *vcpu, s64 kernel_ns) { - u64 tsc =3D pvclock_scale_delta(kernel_ns-vcpu->arch.this_tsc_nsec, - vcpu->arch.virtual_tsc_mult, - vcpu->arch.virtual_tsc_shift); - tsc +=3D vcpu->arch.this_tsc_write; + s64 delta =3D kernel_ns - vcpu->arch.this_tsc_nsec; + u64 tsc =3D vcpu->arch.this_tsc_write; + + /* pvclock_scale_delta cannot cope with negative deltas */ + if (delta >=3D 0) + tsc +=3D pvclock_scale_delta(delta, + vcpu->arch.virtual_tsc_mult, + vcpu->arch.virtual_tsc_shift); + else + tsc -=3D pvclock_scale_delta(-delta, + vcpu->arch.virtual_tsc_mult, + vcpu->arch.virtual_tsc_shift); + return tsc; } =20 @@ -2595,7 +2604,7 @@ static inline bool gtod_is_based_on_tsc(int mode) } #endif =20 -static void kvm_track_tsc_matching(struct kvm_vcpu *vcpu, bool new_generat= ion) +static void kvm_track_tsc_matching(struct kvm_vcpu *vcpu) { #ifdef CONFIG_X86_64 struct kvm_arch *ka =3D &vcpu->kvm->arch; @@ -2612,12 +2621,9 @@ static void kvm_track_tsc_matching(struct kvm_vcpu *= vcpu, bool new_generation) =20 /* * Request a masterclock update if the masterclock needs to be toggled - * on/off, or when starting a new generation and the masterclock is - * enabled (compute_guest_tsc() requires the masterclock snapshot to be - * taken _after_ the new generation is created). + * on/off. */ - if ((ka->use_master_clock && new_generation) || - (ka->use_master_clock !=3D use_master_clock)) + if (ka->use_master_clock !=3D use_master_clock) kvm_make_request(KVM_REQ_MASTERCLOCK_UPDATE, vcpu); =20 trace_kvm_track_tsc(vcpu->vcpu_id, ka->nr_vcpus_matched_tsc, @@ -2803,7 +2809,7 @@ static void __kvm_synchronize_tsc(struct kvm_vcpu *vc= pu, u64 offset, u64 tsc, vcpu->arch.this_tsc_nsec =3D kvm->arch.cur_tsc_nsec; vcpu->arch.this_tsc_write =3D kvm->arch.cur_tsc_write; =20 - kvm_track_tsc_matching(vcpu, !matched); + kvm_track_tsc_matching(vcpu); } =20 static void kvm_synchronize_tsc(struct kvm_vcpu *vcpu, u64 *user_value) --=20 2.39.3 From nobody Sun Feb 8 15:30:31 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 66EB530B53F; Thu, 15 Jan 2026 20:37:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.165.32 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768509434; cv=none; b=sEYOiI1M+tRu5vci6cBiW6diKls9hUbyGA9agselkL20DiZUmqUTl9WZ4PirDVPhRFYEf30b3VEM7lgi8D4FuwJZ56+EILlVK7pkHNaUvtM9u7wpMK+6fAZPu2lRrrQQkkbm/BhAxHwrTnYwN7iLRbD+VofjUm1lJ3bO5p/dYgw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768509434; c=relaxed/simple; bh=atSnSNGUCMvqfMxFOoNvSp3wbHU40Yrg32Mfk4tSgO8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EoYt4VaY2X/ks9vloOUeYewdTWG74Yr9sq+gVSw9zAHps9G9944nRA/h8hMfSd0IMKmls4PFTSdh9KHrAIe7g8xrvrXBzKWpgmak9pSqAS/rw44fOsDHJqZI7jsDtyroBEdeV8nJpZvOnNdL2NboRBFZm50cXMJoiFGnhcRjDd0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=dznVJvgW; arc=none smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="dznVJvgW" Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 60FGpavP2754251; Thu, 15 Jan 2026 20:36:02 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=corp-2025-04-25; bh=LNSBs EGycB+YY3yU8y9K67W3Lr04PTVlTszV4LeZMgE=; b=dznVJvgWKMeg63S7rXT18 N3yFkH86CJM0B495gM0DdXsrhuZ/5WXf7gbqXr2kvJpF4F7ZWPjv/MJ8dKq7cKbZ lEzvkOpcinAW9kh+zbUSJqdHPrpz97LDs2sYlnkex59fFnDlUOZnlE4nyShp0L6U 7TJ62VwdG+pYKQ3xefGN6t9B0ep6ghYinBEkseQRuKrjr+eXgOiir/eLBospm3DB h+V5jjgLFmpcdF4Oo8I8PQcct2J7n2OekAG0pFH47PsfiWP4cwcJlopKvOr/K7qN t9/3M2HA9/nPOzeSFmFGDbRY/BM/o9lZeS3i0ZFf2NJUrDoj833Ph7oLLcvfa7WL g== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4bkpwgrkgu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 15 Jan 2026 20:36:02 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 60FJLVZR035374; Thu, 15 Jan 2026 20:36:01 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4bkd7bsw3q-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 15 Jan 2026 20:36:01 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 60FKXKQR010408; Thu, 15 Jan 2026 20:36:01 GMT Received: from localhost.localdomain (ca-dev80.us.oracle.com [10.211.9.80]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTP id 4bkd7bsw14-3; Thu, 15 Jan 2026 20:36:01 +0000 From: Dongli Zhang To: kvm@vger.kernel.org Cc: seanjc@google.com, pbonzini@redhat.com, dwmw2@infradead.org, dwmw@amazon.co.uk, paul@xen.org, tglx@kernel.org, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, linux-kernel@vger.kernel.org, joe.jin@oracle.com, dongli.zhang@oracle.com Subject: [PATCH 2/3] KVM: x86: conditionally clear KVM_REQ_MASTERCLOCK_UPDATE at the end of KVM_SET_CLOCK Date: Thu, 15 Jan 2026 12:22:30 -0800 Message-ID: <20260115202256.119820-3-dongli.zhang@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260115202256.119820-1-dongli.zhang@oracle.com> References: <20260115202256.119820-1-dongli.zhang@oracle.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2026-01-15_06,2026-01-15_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 mlxscore=0 suspectscore=0 mlxlogscore=999 bulkscore=0 malwarescore=0 phishscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2512120000 definitions=main-2601150161 X-Proofpoint-GUID: Y0PaUXtQa8w_bd5geJNOl64Ua1ebWHQH X-Proofpoint-ORIG-GUID: Y0PaUXtQa8w_bd5geJNOl64Ua1ebWHQH X-Authority-Analysis: v=2.4 cv=ZtLg6t7G c=1 sm=1 tr=0 ts=69694fb2 b=1 cx=c_pps a=WeWmnZmh0fydH62SvGsd2A==:117 a=WeWmnZmh0fydH62SvGsd2A==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=pBOR-ozoAAAA:8 a=yPCof4ZbAAAA:8 a=xtrMm11tuchXP9ObCAUA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTE1MDE2MSBTYWx0ZWRfX91Nv2gRh1BnK E1zJTO2ftc0OalpMrcfha/RxKEpw3w0BIuTj1pCb20piYXVPdJ9ltGwXKZzgfD8p7nHi2UXidsK pA5CS8wcTk9NFa5+JM55HdbGDd0ubnBB457pZflMLCmJMOVAXzOQfefyre2WfSCm4UQFyiGhnuc pcFrtIaHFrkzula1DX34NFa9niWNrG7bGxNWS617JAGNmGyzGtiP58zfdMWoV4CDqdh2F9MvZn5 VkWgWs8AWAwoRFXPNNjKoaAwMVge8U+fDCO0jcuatnQtI89x/cvVRf/atSWW6dEcT8BDvHpuo5s 1c6bHZzr0ng/Dj5KbI+Grn7Gz7h70nYV/GluzwDN0Yr+LQ7KPI+LVZneBvlNGz5RqzsaIXYYI+x LfkxCohemEJnpzyrE2nvooPzfFyA7+A0mpmhuqd/YrWzxtGgtm58oUwrqZjVPwnRxd495FHsK1d wVSIGeo3ia3VvMbOPKQ== Content-Type: text/plain; charset="utf-8" The KVM_SET_CLOCK command calls pvclock_update_vm_gtod_copy() to update the masterclock data. Many vCPUs may already have KVM_REQ_MASTERCLOCK_UPDATE pending before KVM_SET_CLOCK is invoked. If pvclock_update_vm_gtod_copy() decides to use the masterclock, there is no need to update the masterclock multiple times afterward. As noted in commit c52ffadc65e2 ("KVM: x86: Don't unnecessarily force masterclock update on vCPU hotplug"), each unnecessary KVM_REQ_MASTERCLOCK_UPDATE can cause the kvm-clock time to jump. Therefore, clear KVM_REQ_MASTERCLOCK_UPDATE for each vCPU at the end of KVM_SET_CLOCK when the master clock is active. The 'tsc_write_lock' ensures that only requests issued before KVM_SET_CLOCK are cleared. Cc: David Woodhouse Signed-off-by: Dongli Zhang --- arch/x86/kvm/x86.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 5e7418cfd0af..0599949a7803 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -7173,6 +7173,8 @@ static int kvm_vm_ioctl_set_clock(struct kvm *kvm, vo= id __user *argp) { struct kvm_arch *ka =3D &kvm->arch; struct kvm_clock_data data; + struct kvm_vcpu *vcpu; + unsigned long i; u64 now_raw_ns; =20 if (copy_from_user(&data, argp, sizeof(data))) @@ -7211,6 +7213,12 @@ static int kvm_vm_ioctl_set_clock(struct kvm *kvm, v= oid __user *argp) else now_raw_ns =3D get_kvmclock_base_ns(); ka->kvmclock_offset =3D data.clock - now_raw_ns; + + if (kvm->arch.use_master_clock) { + kvm_for_each_vcpu(i, vcpu, kvm) + kvm_clear_request(KVM_REQ_MASTERCLOCK_UPDATE, vcpu); + } + kvm_end_pvclock_update(kvm); return 0; } --=20 2.39.3 From nobody Sun Feb 8 15:30:31 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 908C131A551; Thu, 15 Jan 2026 20:37:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.165.32 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768509445; cv=none; b=tPCrXqJp4MnOZgugt/1ux7O9/5BYPIrMt+4ZbAQojS3+p6xHEgDCVEMS7DzEw5vW13ZKN6fecB5asvqsWETLuQKi/nksSQWp77Y6/5Jez3MDz3QFCjscF9unxDDt5SfyMce0YccVmoRP7llTI/WCKCo1Niz/8z+p5SntXXBiVno= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768509445; c=relaxed/simple; bh=lc3f7DV9sc+W17mcjj6+m4I3HVHtr1i4kaGQk8ODWQE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=W85KPjygSArQD/s8cH61AVuHKY0CHoY6T9u5IQmkMb4TWcbgEwgk6bGjNBgpUSbjLENabbzdbgbjkQoOBG3UqqqchLXhwN2Aemw5f1nWJsEKofbaXPrrJikNINuPi4543hb662kBrXpw3zVsNVZP43alW6D8Xk9JJHoyXB26kF4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=XjqpCsa6; arc=none smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="XjqpCsa6" Received: from pps.filterd (m0333521.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 60FHiSR81295896; Thu, 15 Jan 2026 20:36:03 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=corp-2025-04-25; bh=QC/91 MSBOB2DNGOWstwT0cbVUA1uplJlunnyCp736ZU=; b=XjqpCsa6CcVIuhty6O8tM YYXFqjkHIzsHjZI4DPlg+iATeCKQrEgh4modbndq17zwlDTaMBb6AXfDrOeUdW+N CPVIOyR39KSHevs2izTZWhRZ3LW3UNfxVEvxptsHfXgEnUeCYplsRS8RmWGqlIaT qYs6qFtSVSc93NSPmNWE08GryVnevqIf5uRGvvUsOsVZsm1uWcEaMwYVS8BlE3Hu uvPWQ9Zw/X2p6KiOk1sXFX8KT7EfHcqBzpSx4HN0Stfyw119j42qSaemSDNQyBQd JeOiyjo2KVE5V6jtQD2eG6v+Kk9vOiGACEmxjODY2TnfaWWt42pwTzJIIh62nCsM Q== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4bp5tc3wu8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 15 Jan 2026 20:36:03 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 60FJP62d035258; Thu, 15 Jan 2026 20:36:03 GMT Received: from pps.reinject (localhost [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4bkd7bsw4r-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 15 Jan 2026 20:36:02 +0000 Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 60FKXKQT010408; Thu, 15 Jan 2026 20:36:02 GMT Received: from localhost.localdomain (ca-dev80.us.oracle.com [10.211.9.80]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTP id 4bkd7bsw14-4; Thu, 15 Jan 2026 20:36:02 +0000 From: Dongli Zhang To: kvm@vger.kernel.org Cc: seanjc@google.com, pbonzini@redhat.com, dwmw2@infradead.org, dwmw@amazon.co.uk, paul@xen.org, tglx@kernel.org, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, linux-kernel@vger.kernel.org, joe.jin@oracle.com, dongli.zhang@oracle.com Subject: [PATCH 3/3] KVM: x86: conditionally update masterclock data in pvclock_update_vm_gtod_copy() Date: Thu, 15 Jan 2026 12:22:31 -0800 Message-ID: <20260115202256.119820-4-dongli.zhang@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260115202256.119820-1-dongli.zhang@oracle.com> References: <20260115202256.119820-1-dongli.zhang@oracle.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2026-01-15_06,2026-01-15_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 mlxscore=0 suspectscore=0 mlxlogscore=999 bulkscore=0 malwarescore=0 phishscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2512120000 definitions=main-2601150161 X-Authority-Analysis: v=2.4 cv=XP09iAhE c=1 sm=1 tr=0 ts=69694fb3 b=1 cx=c_pps a=WeWmnZmh0fydH62SvGsd2A==:117 a=WeWmnZmh0fydH62SvGsd2A==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=pBOR-ozoAAAA:8 a=yPCof4ZbAAAA:8 a=szI7cAD4plzaKaVT9zkA:9 X-Proofpoint-GUID: lMbUBmmtxeRRS-rQ2u2vt4KodpoM0GnS X-Proofpoint-ORIG-GUID: lMbUBmmtxeRRS-rQ2u2vt4KodpoM0GnS X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTE1MDE2MSBTYWx0ZWRfXz5vQN6j0l/4F 9fZTIv+q7Kun7e6XAhYBBv3fluO2RNorEaQ1QbqZUZZpm2Bo5JFH1ACljkI4NnoyjrwAWXRy/pZ n4RqbDG5L6JEtv8Di63PrIEM3AccI1uHLOixj4Yo1RF3/3QChLzS5AzkhAqYCY7FkYF/M2yDAfU qy7UvhYdsfMVnScC5SYwQHdLf92gD8svgV78vqkTxmHZsb5qrrEJBUXAD5XMNkzkDEAyUFVXtju dlkJRBNbUOeTtuz7NMxr3yy0tPojsuEBWukovsWTM/QMKwBULkdQjfwJZTtRzMdeWtRePc1wBIR G9RtsJSzLw8OA0rMskptIdpAtQCILrhFfTod0R5cQ6G938kbWMlBHzs7bYB+MePQXk9fP3PVETP pOv1xPFSv+bi30D/l4iKc9dwGeKQfV2alM992fiMQuZkQZRN75gIHTs1VGKwMr749S2LbwnEQd5 fKKSSGwIx/QSlgezvUg== Content-Type: text/plain; charset="utf-8" The pvclock_update_vm_gtod_copy() function always unconditionally updates ka->master_kernel_ns and ka->master_cycle_now whenever a KVM_REQ_MASTERCLOCK_UPDATE occurs. Unfortunately, each masterclock update increases the risk of kvm-clock drift. If pvclock_update_vm_gtod_copy() is not called from vcpu_enter_guest()-->kvm_update_masterclock(), we keep the existing workflow. The argument 'forced' is introduced to tell where it is from. Otherwise, we avoid updating the masterclock if it is already active and will remain active. In such cases, updating the masterclock data is not beneficial and can instead lead to kvm-clock drift. As a result, this patch minimizes the chance of unnecessary masterclock data updates to avoid kvm-clock drift. Cc: David Woodhouse Signed-off-by: Dongli Zhang --- arch/x86/kvm/x86.c | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 0599949a7803..d2ce696abf55 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -3108,12 +3108,15 @@ static bool kvm_get_walltime_and_clockread(struct t= imespec64 *ts, * */ =20 -static void pvclock_update_vm_gtod_copy(struct kvm *kvm) +static void pvclock_update_vm_gtod_copy(struct kvm *kvm, bool forced) { #ifdef CONFIG_X86_64 struct kvm_arch *ka =3D &kvm->arch; int vclock_mode; bool host_tsc_clocksource, vcpus_matched; + bool use_master_clock; + u64 master_kernel_ns; + u64 master_cycle_now; =20 lockdep_assert_held(&kvm->arch.tsc_write_lock); vcpus_matched =3D (ka->nr_vcpus_matched_tsc + 1 =3D=3D @@ -3124,12 +3127,26 @@ static void pvclock_update_vm_gtod_copy(struct kvm = *kvm) * to the guest. */ host_tsc_clocksource =3D kvm_get_time_and_clockread( - &ka->master_kernel_ns, - &ka->master_cycle_now); + &master_kernel_ns, + &master_cycle_now); + + use_master_clock =3D host_tsc_clocksource && vcpus_matched + && !ka->backwards_tsc_observed + && !ka->boot_vcpu_runs_old_kvmclock; + + /* + * Always update masterclock data unconditionally if not for + * KVM_REQ_MASTERCLOCK_UPDATE request. + * + * Otherwise, do not update masterclock data if it is already + * active and will remain active. + */ + if (forced || !(use_master_clock && ka->use_master_clock)) { + ka->master_kernel_ns =3D master_kernel_ns; + ka->master_cycle_now =3D master_cycle_now; + } =20 - ka->use_master_clock =3D host_tsc_clocksource && vcpus_matched - && !ka->backwards_tsc_observed - && !ka->boot_vcpu_runs_old_kvmclock; + ka->use_master_clock =3D use_master_clock; =20 if (ka->use_master_clock) atomic_set(&kvm_guest_has_master_clock, 1); @@ -3179,7 +3196,7 @@ static void kvm_update_masterclock(struct kvm *kvm) { kvm_hv_request_tsc_page_update(kvm); kvm_start_pvclock_update(kvm); - pvclock_update_vm_gtod_copy(kvm); + pvclock_update_vm_gtod_copy(kvm, false); kvm_end_pvclock_update(kvm); } =20 @@ -7189,7 +7206,7 @@ static int kvm_vm_ioctl_set_clock(struct kvm *kvm, vo= id __user *argp) =20 kvm_hv_request_tsc_page_update(kvm); kvm_start_pvclock_update(kvm); - pvclock_update_vm_gtod_copy(kvm); + pvclock_update_vm_gtod_copy(kvm, true); =20 /* * This pairs with kvm_guest_time_update(): when masterclock is @@ -9773,7 +9790,7 @@ static void kvm_hyperv_tsc_notifier(void) =20 list_for_each_entry(kvm, &vm_list, vm_list) { __kvm_start_pvclock_update(kvm); - pvclock_update_vm_gtod_copy(kvm); + pvclock_update_vm_gtod_copy(kvm, true); kvm_end_pvclock_update(kvm); } =20 @@ -13206,7 +13223,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long= type) kvm->arch.kvmclock_offset =3D -get_kvmclock_base_ns(); =20 raw_spin_lock_irqsave(&kvm->arch.tsc_write_lock, flags); - pvclock_update_vm_gtod_copy(kvm); + pvclock_update_vm_gtod_copy(kvm, true); raw_spin_unlock_irqrestore(&kvm->arch.tsc_write_lock, flags); =20 kvm->arch.default_tsc_khz =3D max_tsc_khz ? : tsc_khz; --=20 2.39.3