mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 09:13:55 -06:00
target-i386: Add support to migrate vcpu's TSC rate
This patch enables migrating vcpu's TSC rate. If KVM on the destination machine supports TSC scaling, guest programs will observe a consistent TSC rate across the migration. If TSC scaling is not supported on the destination machine, the migration will not be aborted and QEMU on the destination will not set vcpu's TSC rate to the migrated value. If vcpu's TSC rate specified by CPU option 'tsc-freq' on the destination machine is inconsistent with the migrated TSC rate, the migration will be aborted. For backwards compatibility, the migration of vcpu's TSC rate is disabled on pc-*-2.5 and older machine types. Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> [ehabkost: Rewrote comment at kvm_arch_put_registers()] [ehabkost: Moved compat code to pc-2.5] Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
parent
5031283d52
commit
36f96c4b6b
9 changed files with 50 additions and 2 deletions
|
@ -6,6 +6,8 @@
|
|||
#include "cpu.h"
|
||||
#include "sysemu/kvm.h"
|
||||
|
||||
#include "qemu/error-report.h"
|
||||
|
||||
static const VMStateDescription vmstate_segment = {
|
||||
.name = "segment",
|
||||
.version_id = 1,
|
||||
|
@ -331,6 +333,13 @@ static int cpu_post_load(void *opaque, int version_id)
|
|||
CPUX86State *env = &cpu->env;
|
||||
int i;
|
||||
|
||||
if (env->tsc_khz && env->user_tsc_khz &&
|
||||
env->tsc_khz != env->user_tsc_khz) {
|
||||
error_report("Mismatch between user-specified TSC frequency and "
|
||||
"migrated TSC frequency");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Real mode guest segments register DPL should be zero.
|
||||
* Older KVM version were setting it wrongly.
|
||||
|
@ -839,6 +848,26 @@ static const VMStateDescription vmstate_xss = {
|
|||
}
|
||||
};
|
||||
|
||||
static bool tsc_khz_needed(void *opaque)
|
||||
{
|
||||
X86CPU *cpu = opaque;
|
||||
CPUX86State *env = &cpu->env;
|
||||
MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
|
||||
PCMachineClass *pcmc = PC_MACHINE_CLASS(mc);
|
||||
return env->tsc_khz && pcmc->save_tsc_khz;
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_tsc_khz = {
|
||||
.name = "cpu/tsc_khz",
|
||||
.version_id = 1,
|
||||
.minimum_version_id = 1,
|
||||
.needed = tsc_khz_needed,
|
||||
.fields = (VMStateField[]) {
|
||||
VMSTATE_INT64(env.tsc_khz, X86CPU),
|
||||
VMSTATE_END_OF_LIST()
|
||||
}
|
||||
};
|
||||
|
||||
VMStateDescription vmstate_x86_cpu = {
|
||||
.name = "cpu",
|
||||
.version_id = 12,
|
||||
|
@ -961,6 +990,7 @@ VMStateDescription vmstate_x86_cpu = {
|
|||
&vmstate_msr_hyperv_stimer,
|
||||
&vmstate_avx512,
|
||||
&vmstate_xss,
|
||||
&vmstate_tsc_khz,
|
||||
NULL
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue