mirror of
https://github.com/qemu/qemu.git
synced 2024-11-24 03:13:44 +08:00
target-i386: block migration and savevm if invariant tsc is exposed
Invariant TSC documentation mentions that "invariant TSC will run at a constant rate in all ACPI P-, C-. and T-states". This is not the case if migration to a host with different TSC frequency is allowed, or if savevm is performed. So block migration/savevm. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> [AF+mtosatti: Updated error message] Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
parent
7d854c471a
commit
68bfd0ad4a
@ -121,7 +121,7 @@ static inline X86CPU *x86_env_get_cpu(CPUX86State *env)
|
|||||||
#define ENV_OFFSET offsetof(X86CPU, env)
|
#define ENV_OFFSET offsetof(X86CPU, env)
|
||||||
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
extern const struct VMStateDescription vmstate_x86_cpu;
|
extern struct VMStateDescription vmstate_x86_cpu;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -35,6 +35,8 @@
|
|||||||
#include "exec/ioport.h"
|
#include "exec/ioport.h"
|
||||||
#include <asm/hyperv.h>
|
#include <asm/hyperv.h>
|
||||||
#include "hw/pci/pci.h"
|
#include "hw/pci/pci.h"
|
||||||
|
#include "migration/migration.h"
|
||||||
|
#include "qapi/qmp/qerror.h"
|
||||||
|
|
||||||
//#define DEBUG_KVM
|
//#define DEBUG_KVM
|
||||||
|
|
||||||
@ -448,6 +450,8 @@ static bool hyperv_enabled(X86CPU *cpu)
|
|||||||
cpu->hyperv_relaxed_timing);
|
cpu->hyperv_relaxed_timing);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Error *invtsc_mig_blocker;
|
||||||
|
|
||||||
#define KVM_MAX_CPUID_ENTRIES 100
|
#define KVM_MAX_CPUID_ENTRIES 100
|
||||||
|
|
||||||
int kvm_arch_init_vcpu(CPUState *cs)
|
int kvm_arch_init_vcpu(CPUState *cs)
|
||||||
@ -705,6 +709,17 @@ int kvm_arch_init_vcpu(CPUState *cs)
|
|||||||
!!(c->ecx & CPUID_EXT_SMX);
|
!!(c->ecx & CPUID_EXT_SMX);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c = cpuid_find_entry(&cpuid_data.cpuid, 0x80000007, 0);
|
||||||
|
if (c && (c->edx & 1<<8) && invtsc_mig_blocker == NULL) {
|
||||||
|
/* for migration */
|
||||||
|
error_setg(&invtsc_mig_blocker,
|
||||||
|
"State blocked by non-migratable CPU device"
|
||||||
|
" (invtsc flag)");
|
||||||
|
migrate_add_blocker(invtsc_mig_blocker);
|
||||||
|
/* for savevm */
|
||||||
|
vmstate_x86_cpu.unmigratable = 1;
|
||||||
|
}
|
||||||
|
|
||||||
cpuid_data.cpuid.padding = 0;
|
cpuid_data.cpuid.padding = 0;
|
||||||
r = kvm_vcpu_ioctl(cs, KVM_SET_CPUID2, &cpuid_data);
|
r = kvm_vcpu_ioctl(cs, KVM_SET_CPUID2, &cpuid_data);
|
||||||
if (r) {
|
if (r) {
|
||||||
|
@ -603,7 +603,7 @@ static const VMStateDescription vmstate_msr_hyperv_time = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const VMStateDescription vmstate_x86_cpu = {
|
VMStateDescription vmstate_x86_cpu = {
|
||||||
.name = "cpu",
|
.name = "cpu",
|
||||||
.version_id = 12,
|
.version_id = 12,
|
||||||
.minimum_version_id = 3,
|
.minimum_version_id = 3,
|
||||||
|
Loading…
Reference in New Issue
Block a user