kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Like Xu <like.xu.linux@gmail.com>
To: Sean Christopherson <seanjc@google.com>,
	Paolo Bonzini <pbonzini@redhat.com>
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH] KVM: x86/tsc: Update guest tsc_offset again before vcpu first runs
Date: Fri, 30 Jun 2023 00:48:38 +0800	[thread overview]
Message-ID: <20230629164838.66847-1-likexu@tencent.com> (raw)

From: Like Xu <likexu@tencent.com>

When a new vcpu is created and subsequently restored by vcpu snapshot,
apply kvm_vcpu_write_tsc_offset() before vcpu runs for the first time.

Before a vcpu runs for the first time, the user space (VMM) sets the guest
tsc as it wants, which may triggers the time synchronization mechanism with
other vcpus (if any). In a scenario where a vcpu snapshot is used to
restore, like the bugzilla report [*], the newly target guest tsc (e.g.
at the time of vcpu restoration) is synchronized with its the most
primitive guest timestamp initialized at the time of vcpu creation.

Furthermore, the VMM can actually update the target guest tsc multiple
times before the vcpu actually gets running, which requires the tsc_offset
to be updated every time it is set. In this scenario, it can be considered
as unstable tsc (even this vcpu has not yet even started ticking to follow
the intended logic of KVM timer emulation).

It is only necessary to delay this step until kvm_arch_vcpu_load() to
catch up with guest expectation with the help of kvm_vcpu_has_run(),
and the change is expected to not break any of the cumbersome existing
virt timer features.

Reported-by: Yong He <alexyonghe@tencent.com>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217423 [*] 
Tested-by: Jinrong Liang <cloudliang@tencent.com>
Signed-off-by: Like Xu <likexu@tencent.com>
---
 arch/x86/kvm/x86.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 439312e04384..616940fc3791 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -4818,7 +4818,7 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
 		if (tsc_delta < 0)
 			mark_tsc_unstable("KVM discovered backwards TSC");
 
-		if (kvm_check_tsc_unstable()) {
+		if (kvm_check_tsc_unstable() || !kvm_vcpu_has_run(vcpu)) {
 			u64 offset = kvm_compute_l1_tsc_offset(vcpu,
 						vcpu->arch.last_guest_tsc);
 			kvm_vcpu_write_tsc_offset(vcpu, offset);

base-commit: 88bb466c9dec4f70d682cf38c685324e7b1b3d60
-- 
2.32.0


             reply	other threads:[~2023-06-29 16:48 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-29 16:48 Like Xu [this message]
2023-06-29 17:19 ` [PATCH] KVM: x86/tsc: Update guest tsc_offset again before vcpu first runs Sean Christopherson
2023-06-30 17:21   ` Oliver Upton
2023-06-30 17:24     ` Oliver Upton
2023-07-04  8:01     ` Like Xu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230629164838.66847-1-likexu@tencent.com \
    --to=like.xu.linux@gmail.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=seanjc@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).