qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Maciej S. Szmigiero" <maciej.szmigiero@oracle.com>,
	qemu-stable@nongnu.org
Subject: [PULL 03/34] target/i386: Reset parked vCPUs together with the online ones
Date: Wed, 23 Apr 2025 11:40:33 +0200	[thread overview]
Message-ID: <20250423094105.40692-4-pbonzini@redhat.com> (raw)
In-Reply-To: <20250423094105.40692-1-pbonzini@redhat.com>

From: "Maciej S. Szmigiero" <maciej.szmigiero@oracle.com>

Commit 3f2a05b31ee9 ("target/i386: Reset TSCs of parked vCPUs too on VM
reset") introduced a way to reset TSCs of parked vCPUs during VM reset to
prevent them getting desynchronized with the online vCPUs and therefore
causing the KVM PV clock to lose PVCLOCK_TSC_STABLE_BIT.

The way this was done was by registering a parked vCPU-specific QEMU reset
callback via qemu_register_reset().

However, it turns out that on particularly device-rich VMs QEMU reset
callbacks can take a long time to execute (which isn't surprising,
considering that they involve resetting all of VM devices).

In particular, their total runtime can exceed the 1-second TSC
synchronization window introduced in KVM commit 5d3cb0f6a8e3 ("KVM:
Improve TSC offset matching").
Since the TSCs of online vCPUs are only reset from "synchronize_post_reset"
AccelOps handler (which runs after all qemu_register_reset() handlers) this
essentially makes that fix ineffective on these VMs.

The easiest way to guarantee that these parked vCPUs are reset at the same
time as the online ones (regardless how long it takes for VM devices to
reset) is to piggyback on post-reset vCPU synchronization handler for one
of online vCPUs - as there is no generic post-reset AccelOps handler that
isn't per-vCPU.

The first online vCPU was selected for that since it is easily available
under "first_cpu" define.
This does not create an ordering issue since the order of vCPU TSC resets
does not matter.

Fixes: 3f2a05b31ee9 ("target/i386: Reset TSCs of parked vCPUs too on VM reset")
Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
Link: https://lore.kernel.org/r/e8b85a5915f79aa177ca49eccf0e9b534470c1cd.1743099810.git.maciej.szmigiero@oracle.com
Cc: qemu-stable@nongnu.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 accel/kvm/kvm-all.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index f89568bfa39..951e8214e07 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -437,9 +437,8 @@ int kvm_unpark_vcpu(KVMState *s, unsigned long vcpu_id)
     return kvm_fd;
 }
 
-static void kvm_reset_parked_vcpus(void *param)
+static void kvm_reset_parked_vcpus(KVMState *s)
 {
-    KVMState *s = param;
     struct KVMParkedVcpu *cpu;
 
     QLIST_FOREACH(cpu, &s->kvm_parked_vcpus, node) {
@@ -2738,7 +2737,6 @@ static int kvm_init(MachineState *ms)
     }
 
     qemu_register_reset(kvm_unpoison_all, NULL);
-    qemu_register_reset(kvm_reset_parked_vcpus, s);
 
     if (s->kernel_irqchip_allowed) {
         kvm_irqchip_create(s);
@@ -2908,6 +2906,10 @@ static void do_kvm_cpu_synchronize_post_reset(CPUState *cpu, run_on_cpu_data arg
 void kvm_cpu_synchronize_post_reset(CPUState *cpu)
 {
     run_on_cpu(cpu, do_kvm_cpu_synchronize_post_reset, RUN_ON_CPU_NULL);
+
+    if (cpu == first_cpu) {
+        kvm_reset_parked_vcpus(kvm_state);
+    }
 }
 
 static void do_kvm_cpu_synchronize_post_init(CPUState *cpu, run_on_cpu_data arg)
-- 
2.49.0



  parent reply	other threads:[~2025-04-23  9:42 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-23  9:40 [PULL 00/34] i386, Rust, SCSI changes for 2025-04-23 Paolo Bonzini
2025-04-23  9:40 ` [PULL 01/34] scsi: add conversion from ENODEV to sense Paolo Bonzini
2025-04-23  9:40 ` [PULL 02/34] target/i386: Fix model number of Zhaoxin YongFeng vCPU template Paolo Bonzini
2025-04-23  9:40 ` Paolo Bonzini [this message]
2025-04-23  9:40 ` [PULL 04/34] target/i386/hvf: fix lflags_to_rflags Paolo Bonzini
2025-04-23  9:40 ` [PULL 05/34] target/i386: special case ADC/SBB x,0 and SBB x,x Paolo Bonzini
2025-04-23  9:40 ` [PULL 06/34] target/i386: tcg: remove tmp0 and tmp4 from SHLD/SHRD Paolo Bonzini
2025-04-23  9:40 ` [PULL 07/34] target/i386: tcg: remove subf from SHLD/SHRD expansion Paolo Bonzini
2025-04-23  9:40 ` [PULL 08/34] target/i386: tcg: remove tmp0 Paolo Bonzini
2025-04-23  9:40 ` [PULL 09/34] target/i386: tcg: remove some more uses of temporaries Paolo Bonzini
2025-04-23  9:40 ` [PULL 10/34] target/i386: tcg: simplify computation of AF after INC/DEC Paolo Bonzini
2025-04-23  9:40 ` [PULL 11/34] target/i386: emulate: microoptimize and explain ADD_COUT_VEC/SUB_COUT_VEC Paolo Bonzini
2025-04-23  9:40 ` [PULL 12/34] target/i386: tcg: use cout to commonize add/adc/sub/sbb cases Paolo Bonzini
2025-04-23  9:40 ` [PULL 13/34] target/i386/hvf: introduce x86_emul_ops Paolo Bonzini
2025-04-23  9:40 ` [PULL 14/34] target/i386/hvf: remove HVF specific calls from x86_decode.c Paolo Bonzini
2025-04-23  9:40 ` [PULL 15/34] target/i386/hvf: provide and use handle_io in emul_ops Paolo Bonzini
2025-04-23  9:40 ` [PULL 16/34] target/i386: rename hvf_mmio_buf to emu_mmio_buf Paolo Bonzini
2025-04-23  9:40 ` [PULL 17/34] target/i386/hvf: use emul_ops->read_mem in x86_emu.c Paolo Bonzini
2025-04-23  9:40 ` [PULL 18/34] target/i386/hvf: provide and use write_mem in emul_ops Paolo Bonzini
2025-04-23  9:40 ` [PULL 19/34] target/i386/hvf: provide and use simulate_{wrmsr, rdmsr} " Paolo Bonzini
2025-04-23  9:40 ` [PULL 20/34] target/i386: rename lazy flags field and its type Paolo Bonzini
2025-04-23  9:40 ` [PULL 21/34] target/i386/hvf: drop unused headers Paolo Bonzini
2025-04-23  9:40 ` [PULL 22/34] target/i386/hvf: rename some include guards Paolo Bonzini
2025-04-23  9:40 ` [PULL 23/34] target/i386: add a directory for x86 instruction emulator Paolo Bonzini
2025-04-23  9:40 ` [PULL 24/34] target/i386/emulate: add a panic.h Paolo Bonzini
2025-04-23  9:40 ` [PULL 25/34] target/i386: move x86 instruction emulator out of hvf Paolo Bonzini
2025-04-23  9:40 ` [PULL 26/34] MAINTAINERS: add an entry for the x86 instruction emulator Paolo Bonzini
2025-04-23  9:40 ` [PULL 27/34] target/i386/emulate: remove flags_mask Paolo Bonzini
2025-04-23  9:40 ` [PULL 28/34] i386/cpu: Consolidate the helper to get Host's vendor Paolo Bonzini
2025-04-23  9:40 ` [PULL 29/34] rust/hpet: convert num_timers to u8 type Paolo Bonzini
2025-04-23  9:41 ` [PULL 30/34] rust/hpet: convert HPETTimer index " Paolo Bonzini
2025-04-23  9:41 ` [PULL 31/34] rust/hpet: Fix a clippy error Paolo Bonzini
2025-04-23  9:41 ` [PULL 32/34] rust/vmstate_test: Fix typo in test_vmstate_macro_array_of_pointer_wrapped() Paolo Bonzini
2025-04-23  9:41 ` [PULL 33/34] rust/hw/char/pl011: Extract extract DR read logic into separate function Paolo Bonzini
2025-04-23  9:41 ` [PULL 34/34] rust/hw/char/pl011: Extract DR write " Paolo Bonzini
2025-04-23 17:58 ` [PULL 00/34] i386, Rust, SCSI changes for 2025-04-23 Stefan Hajnoczi

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=20250423094105.40692-4-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=maciej.szmigiero@oracle.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-stable@nongnu.org \
    /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).