From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48127) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WlHzP-0005TJ-Ry for qemu-devel@nongnu.org; Fri, 16 May 2014 09:16:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WlHzI-0007FS-Tf for qemu-devel@nongnu.org; Fri, 16 May 2014 09:15:55 -0400 Received: from mx1.redhat.com ([209.132.183.28]:24740) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WlHzI-0007Et-B9 for qemu-devel@nongnu.org; Fri, 16 May 2014 09:15:48 -0400 Date: Fri, 16 May 2014 09:15:36 -0400 From: Luiz Capitulino Message-ID: <20140516091536.5178cdde@redhat.com> In-Reply-To: <5375D4D8.1020700@suse.de> References: <1398876525-28831-1-git-send-email-ehabkost@redhat.com> <1398876525-28831-18-git-send-email-ehabkost@redhat.com> <5375220F.6060505@suse.de> <5375D4D8.1020700@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v4 17/18] target-i386: block migration and savevm if invariant tsc is exposed List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Andreas =?UTF-8?B?RsOkcmJlcg==?= Cc: Eduardo Habkost , Juan Quintela , Marcelo Tosatti , qemu-devel@nongnu.org, Cole Robinson , Paolo Bonzini , Igor Mammedov , Aurelien Jarno , Richard Henderson On Fri, 16 May 2014 11:05:28 +0200 Andreas F=C3=A4rber wrote: > Am 15.05.2014 22:22, schrieb Andreas F=C3=A4rber: > > Am 30.04.2014 18:48, schrieb Eduardo Habkost: > >> From: Marcelo Tosatti > >> > >> 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 frequen= cy > >> is allowed, or if savevm is performed. So block migration/savevm. > >> > >> Also do not expose invariant tsc flag by default. > >> > >> Cc: Juan Quintela > >> Signed-off-by: Marcelo Tosatti > >> Reviewed-by: Eduardo Habkost > >> Signed-off-by: Eduardo Habkost > >> --- > >> target-i386/cpu-qom.h | 2 +- > >> target-i386/kvm.c | 13 +++++++++++++ > >> target-i386/machine.c | 2 +- > >> 3 files changed, 15 insertions(+), 2 deletions(-) > >> > >> diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h > >> index 016f90d..473d803 100644 > >> --- a/target-i386/cpu-qom.h > >> +++ b/target-i386/cpu-qom.h > >> @@ -121,7 +121,7 @@ static inline X86CPU *x86_env_get_cpu(CPUX86State = *env) > >> #define ENV_OFFSET offsetof(X86CPU, env) > >> =20 > >> #ifndef CONFIG_USER_ONLY > >> -extern const struct VMStateDescription vmstate_x86_cpu; > >> +extern struct VMStateDescription vmstate_x86_cpu; > >> #endif > >> =20 > >> /** > >> diff --git a/target-i386/kvm.c b/target-i386/kvm.c > >> index 4389959..99cc7e3 100644 > >> --- a/target-i386/kvm.c > >> +++ b/target-i386/kvm.c > >> @@ -33,6 +33,8 @@ > >> #include "exec/ioport.h" > >> #include > >> #include "hw/pci/pci.h" > >> +#include "migration/migration.h" > >> +#include "qapi/qmp/qerror.h" > >> =20 > >> //#define DEBUG_KVM > >> =20 > >> @@ -447,6 +449,8 @@ static bool hyperv_enabled(X86CPU *cpu) > >> cpu->hyperv_relaxed_timing); > >> } > >> =20 > >> +Error *invtsc_mig_blocker; > >=20 > > This should be static, even if no zero-initialization is needed below. > >=20 > >> + > >> #define KVM_MAX_CPUID_ENTRIES 100 > >> =20 > >> int kvm_arch_init_vcpu(CPUState *cs) > >> @@ -702,6 +706,15 @@ int kvm_arch_init_vcpu(CPUState *cs) > >> !!(c->ecx & CPUID_EXT_SMX); > >> } > >> =20 > >> + c =3D cpuid_find_entry(&cpuid_data.cpuid, 0x80000007, 0); > >> + if (c && (c->edx & 1<<8) && invtsc_mig_blocker =3D=3D NULL) { > >> + /* for migration */ > >> + error_set(&invtsc_mig_blocker, QERR_MIGRATION_NOT_SUPPORTED, = "cpu"); > >=20 > > This does not compile for me. error_setg()? With what text? >=20 > http://git.qemu-project.org/?p=3Dqemu.git;a=3Dblobdiff;f=3Dinclude/qapi/q= mp/qerror.h;h=3D01d1d0661c607ace1c5d3831e5c79eeab851f6b7;hp=3Da72bbc98503fe= 261bb8d2c407220252b1e6a85a4;hb=3Df231b88db14f13ee9a41599896f57f3594c1ca8b;h= pb=3Dd73f0beadb57f885e678bffc362864f4401262e0 >=20 > -#define QERR_MIGRATION_NOT_SUPPORTED \ > - ERROR_CLASS_GENERIC_ERROR, "State blocked by non-migratable device > '%s'" >=20 > Suggesting something nicer than "device 'cpu'": >=20 > diff --git a/target-i386/kvm.c b/target-i386/kvm.c > index 1fe8512..9b09a1a 100644 > --- a/target-i386/kvm.c > +++ b/target-i386/kvm.c > @@ -710,7 +710,8 @@ int kvm_arch_init_vcpu(CPUState *cs) > c =3D cpuid_find_entry(&cpuid_data.cpuid, 0x80000007, 0); > if (c && (c->edx & 1<<8) && invtsc_mig_blocker =3D=3D NULL) { > /* for migration */ > - error_set(&invtsc_mig_blocker, QERR_MIGRATION_NOT_SUPPORTED, > "cpu"); > + error_setg(&invtsc_mig_blocker, > + "State blocked by non-migratable CPU device"); That seems correct to me. > migrate_add_blocker(invtsc_mig_blocker); > /* for savevm */ > vmstate_x86_cpu.unmigratable =3D 1; >=20 > >=20 > > Regards, > > Andreas >=20