Revert "kvmclock: Ensure time in migration never goes backward"
This reverts commit a096b3a6732f846ec57dc28b47ee9435aa0609bf. This patch caused a hang that was fixed by commit 9b17868 (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/host-utils.h"
 | 
			
		||||
#include "sysemu/sysemu.h"
 | 
			
		||||
#include "sysemu/kvm.h"
 | 
			
		||||
#include "hw/sysbus.h"
 | 
			
		||||
@ -35,47 +34,6 @@ typedef struct KVMClockState {
 | 
			
		||||
    bool clock_valid;
 | 
			
		||||
} 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,
 | 
			
		||||
                                     RunState state)
 | 
			
		||||
@ -87,15 +45,9 @@ static void kvmclock_vm_state_change(void *opaque, int running,
 | 
			
		||||
 | 
			
		||||
    if (running) {
 | 
			
		||||
        struct kvm_clock_data data;
 | 
			
		||||
        uint64_t time_at_migration = kvmclock_current_nsec(s);
 | 
			
		||||
 | 
			
		||||
        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.flags = 0;
 | 
			
		||||
        ret = kvm_vm_ioctl(kvm_state, KVM_SET_CLOCK, &data);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user