Hi Peng Ju, On 11/20/25 12:44 AM, Peng Ju Zhou wrote: > Problem > After live migration, the guest monotonic clock may jump forward on the > target. > > Cause > kvmclock (the guest’s time base) is derived from host wall time and keeps > advancing while the VM is paused. During STOP_COPY, QEMU reads kvmclock twice: > 1) immediately after the VM is paused, and > 2) when final CPU state is collected. > Only the second (later) value is migrated. The gap between the two reads is > roughly the downtime, so the target restores from a later time and the guest > monotonic clock jumps ahead.
According to prior discussion, it is expected to account live migration downtime. https://lore.kernel.org/qemu-devel/[email protected]/ That is, the jump forward is expected during live migration. I used to send a QEMU patch to account live migration downtime. [PATCH 1/1] target/i386/kvm: account blackout downtime for kvm-clock and guest TSC https://lore.kernel.org/qemu-devel/[email protected]/ Thank you very much! Dongli Zhang > > Fix > Migrate the kvmclock value captured at pause time (the first read) so the > target > restores from the actual pause point. > > Signed-off-by: Peng Ju Zhou <[email protected]> > --- > hw/i386/kvm/clock.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/hw/i386/kvm/clock.c b/hw/i386/kvm/clock.c > index 40aa9a32c3..cd6f7e1315 100644 > --- a/hw/i386/kvm/clock.c > +++ b/hw/i386/kvm/clock.c > @@ -43,6 +43,7 @@ struct KVMClockState { > > /* whether the 'clock' value was obtained in the 'paused' state */ > bool runstate_paused; > + RunState state; > > /* whether machine type supports reliable KVM_GET_CLOCK */ > bool mach_use_reliable_get_clock; > @@ -108,7 +109,10 @@ static void kvm_update_clock(KVMClockState *s) > fprintf(stderr, "KVM_GET_CLOCK failed: %s\n", strerror(-ret)); > abort(); > } > - s->clock = data.clock; > + > + if (s->state != RUN_STATE_FINISH_MIGRATE) { > + s->clock = data.clock; > + } > > /* If kvm_has_adjust_clock_stable() is false, KVM_GET_CLOCK returns > * essentially CLOCK_MONOTONIC plus a guest-specific adjustment. This > @@ -217,6 +221,8 @@ static void kvmclock_vm_state_change(void *opaque, bool > running, > */ > s->clock_valid = true; > } > + > + s->state = state; > } > > static void kvmclock_realize(DeviceState *dev, Error **errp)
