From cc60fde1ea12ad942713d0c78f8b7c94df64229b Mon Sep 17 00:00:00 2001 From: Laurent Vivier Date: Wed, 12 Jul 2017 07:45:34 +0200 Subject: [PATCH 1/6] ppc/kvm: have the "family" CPU alias to point to TYPE_HOST_POWERPC_CPU RH-Author: Laurent Vivier Message-id: <20170712074534.19224-1-lvivier@redhat.com> Patchwork-id: 75735 O-Subject: [RHEL-ALT-7.4 qemu-kvm PATCH] ppc/kvm: have the "family" CPU alias to point to TYPE_HOST_POWERPC_CPU Bugzilla: 1460908 RH-Acked-by: Thomas Huth RH-Acked-by: David Gibson RH-Acked-by: Miroslav Rezanina From: Greg Kurz When running KVM on POWER, we allow the user to pass "-cpu POWERx" instead of "-cpu host". This is achieved by patching the ppc_cpu_aliases[] array so that "POWERx" points to the CPU class with the same PVR as the host CPU. This causes CPUs to be instantiated from this CPU class instead of the TYPE_HOST_POWERPC_CPU class which is used with "-cpu host". These CPUs thus miss all the KVM specific tuning from kvmppc_host_cpu_class_init(). This currently causes QEMU with "-cpu POWER9" to fail when running KVM on a POWER9 DD1 host: qemu-system-ppc64: Register sync failed... If you're using kvm-hv.ko, only "-cpu host" is possible kvm_init_vcpu failed: Invalid argument Let's have the "POWERx" alias to point to TYPE_HOST_POWERPC_CPU directly, so that "-cpu POWERx" instantiates CPUs from the same class as "-cpu host". Signed-off-by: Greg Kurz Tested-by: Laurent Vivier Reviewed-by: Laurent Vivier Reviewed-by: Thomas Huth Signed-off-by: David Gibson (cherry picked from commit 92e926e1e37aea7e1632535b6611ed4f62414af1) Signed-off-by: Laurent Vivier Signed-off-by: Miroslav Rezanina --- target/ppc/kvm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index 1765204..9eb85ae 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -2448,6 +2448,7 @@ static int kvm_ppc_register_host_cpu_type(void) .class_init = kvmppc_host_cpu_class_init, }; PowerPCCPUClass *pvr_pcc; + ObjectClass *oc; DeviceClass *dc; int i; @@ -2458,6 +2459,9 @@ static int kvm_ppc_register_host_cpu_type(void) type_info.parent = object_class_get_name(OBJECT_CLASS(pvr_pcc)); type_register(&type_info); + oc = object_class_by_name(type_info.name); + g_assert(oc); + #if defined(TARGET_PPC64) type_info.name = g_strdup_printf("%s-"TYPE_SPAPR_CPU_CORE, "host"); type_info.parent = TYPE_SPAPR_CPU_CORE, @@ -2477,7 +2481,6 @@ static int kvm_ppc_register_host_cpu_type(void) dc = DEVICE_CLASS(ppc_cpu_get_family_class(pvr_pcc)); for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) { if (strcmp(ppc_cpu_aliases[i].alias, dc->desc) == 0) { - ObjectClass *oc = OBJECT_CLASS(pvr_pcc); char *suffix; ppc_cpu_aliases[i].model = g_strdup(object_class_get_name(oc)); -- 1.8.3.1