Revert "kvmclock: Ensure time in migration never goes backward"
This reverts commita096b3a673
. This patch caused a hang that was fixed by commit9b17868
(kvmclock: Ensure proper env->tsc value for kvmclock_current_nsec calculation, 2014-06-03), and we just had to revert that commit. Drop this one too. Cc: agraf@suse.de Cc: mtosatti@redhat.com Cc: qemu-stable@nongnu.org Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
108e4c3871
commit
fa666c10f2
|
@ -14,7 +14,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "qemu/host-utils.h"
|
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "sysemu/kvm.h"
|
#include "sysemu/kvm.h"
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
|
@ -35,47 +34,6 @@ typedef struct KVMClockState {
|
||||||
bool clock_valid;
|
bool clock_valid;
|
||||||
} KVMClockState;
|
} KVMClockState;
|
||||||
|
|
||||||
struct pvclock_vcpu_time_info {
|
|
||||||
uint32_t version;
|
|
||||||
uint32_t pad0;
|
|
||||||
uint64_t tsc_timestamp;
|
|
||||||
uint64_t system_time;
|
|
||||||
uint32_t tsc_to_system_mul;
|
|
||||||
int8_t tsc_shift;
|
|
||||||
uint8_t flags;
|
|
||||||
uint8_t pad[2];
|
|
||||||
} __attribute__((__packed__)); /* 32 bytes */
|
|
||||||
|
|
||||||
static uint64_t kvmclock_current_nsec(KVMClockState *s)
|
|
||||||
{
|
|
||||||
CPUState *cpu = first_cpu;
|
|
||||||
CPUX86State *env = cpu->env_ptr;
|
|
||||||
hwaddr kvmclock_struct_pa = env->system_time_msr & ~1ULL;
|
|
||||||
uint64_t migration_tsc = env->tsc;
|
|
||||||
struct pvclock_vcpu_time_info time;
|
|
||||||
uint64_t delta;
|
|
||||||
uint64_t nsec_lo;
|
|
||||||
uint64_t nsec_hi;
|
|
||||||
uint64_t nsec;
|
|
||||||
|
|
||||||
if (!(env->system_time_msr & 1ULL)) {
|
|
||||||
/* KVM clock not active */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
cpu_physical_memory_read(kvmclock_struct_pa, &time, sizeof(time));
|
|
||||||
|
|
||||||
delta = migration_tsc - time.tsc_timestamp;
|
|
||||||
if (time.tsc_shift < 0) {
|
|
||||||
delta >>= -time.tsc_shift;
|
|
||||||
} else {
|
|
||||||
delta <<= time.tsc_shift;
|
|
||||||
}
|
|
||||||
|
|
||||||
mulu64(&nsec_lo, &nsec_hi, delta, time.tsc_to_system_mul);
|
|
||||||
nsec = (nsec_lo >> 32) | (nsec_hi << 32);
|
|
||||||
return nsec + time.system_time;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void kvmclock_vm_state_change(void *opaque, int running,
|
static void kvmclock_vm_state_change(void *opaque, int running,
|
||||||
RunState state)
|
RunState state)
|
||||||
|
@ -87,15 +45,9 @@ static void kvmclock_vm_state_change(void *opaque, int running,
|
||||||
|
|
||||||
if (running) {
|
if (running) {
|
||||||
struct kvm_clock_data data;
|
struct kvm_clock_data data;
|
||||||
uint64_t time_at_migration = kvmclock_current_nsec(s);
|
|
||||||
|
|
||||||
s->clock_valid = false;
|
s->clock_valid = false;
|
||||||
|
|
||||||
/* We can't rely on the migrated clock value, just discard it */
|
|
||||||
if (time_at_migration) {
|
|
||||||
s->clock = time_at_migration;
|
|
||||||
}
|
|
||||||
|
|
||||||
data.clock = s->clock;
|
data.clock = s->clock;
|
||||||
data.flags = 0;
|
data.flags = 0;
|
||||||
ret = kvm_vm_ioctl(kvm_state, KVM_SET_CLOCK, &data);
|
ret = kvm_vm_ioctl(kvm_state, KVM_SET_CLOCK, &data);
|
||||||
|
|
Loading…
Reference in New Issue