Commit 41733249 authored by Maxiwell S. Garcia's avatar Maxiwell S. Garcia Committed by Eduardo Habkost
Browse files

migration: Do not re-read the clock on pre_save in case of paused guest



The clock move makes the guest knows about the paused time between the
'stop' and 'migrate' commands. This is an issue in an already-paused
VM because some side effects, like process stalls, could happen
after migration.

So, this patch checks the runstate of guest in the pre_save handler and
do not re-reads the clock in case of paused state (cold migration).

Signed-off-by: default avatarMaxiwell S. Garcia <maxiwell@linux.ibm.com>
Message-Id: <20190829210711.6570-1-maxiwell@linux.ibm.com>
Reviewed-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: default avatarEduardo Habkost <ehabkost@redhat.com>
parent c6c1bb89
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -41,6 +41,9 @@ typedef struct KVMClockState {
    uint64_t clock;
    bool clock_valid;

    /* whether the 'clock' value was obtained in the 'paused' state */
    bool runstate_paused;

    /* whether machine type supports reliable KVM_GET_CLOCK */
    bool mach_use_reliable_get_clock;

@@ -202,6 +205,8 @@ static void kvmclock_vm_state_change(void *opaque, int running,
            return;
        }

        s->runstate_paused = runstate_check(RUN_STATE_PAUSED);

        kvm_synchronize_all_tsc();

        kvm_update_clock(s);
@@ -260,9 +265,9 @@ static int kvmclock_pre_load(void *opaque)
}

/*
 * When migrating, read the clock just before migration,
 * so that the guest clock counts during the events
 * between:
 * When migrating a running guest, read the clock just
 * before migration, so that the guest clock counts
 * during the events between:
 *
 *  * vm_stop()
 *  *
@@ -277,7 +282,9 @@ static int kvmclock_pre_save(void *opaque)
{
    KVMClockState *s = opaque;

    if (!s->runstate_paused) {
        kvm_update_clock(s);
    }

    return 0;
}