[Qemu-devel] [PATCH v2] pc: make sure that plugged CPUs are of the same type

Igor Mammedov posted 1 patch 6 years, 6 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/1507648660-201549-1-git-send-email-imammedo@redhat.com
Test checkpatch passed
Test docker passed
Test s390x passed
hw/i386/pc.c | 7 +++++++
1 file changed, 7 insertions(+)
[Qemu-devel] [PATCH v2] pc: make sure that plugged CPUs are of the same type
Posted by Igor Mammedov 6 years, 6 months ago
heterogeneous cpus are not supported and hotplugging different
cpu model crashes QEMU:

  qemu-system-x86_64 -cpu qemu64 -smp 1,maxcpus=2
  (qemu) device_add host-x86_64-cpu,socket-id=1,core-id=0,thread-id=0,id=foo
  (qemu) info cpus
  error: failed to get MSR 0x38d
  qemu-system-x86_64: target/i386/kvm.c:2121: kvm_get_msrs: Assertion `ret == cpu->kvm_msr_buf->nmsrs' failed.
  Aborted (core dumped)

Gracefully fail hotplug process in case of user mistake.

Reported-by: Greg Kurz <groug@kaod.org>
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  fix checkpatch error
---
 hw/i386/pc.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 05985d4..8e307f7 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1876,8 +1876,15 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
     CPUArchId *cpu_slot;
     X86CPUTopoInfo topo;
     X86CPU *cpu = X86_CPU(dev);
+    MachineState *ms = MACHINE(hotplug_dev);
     PCMachineState *pcms = PC_MACHINE(hotplug_dev);
 
+    if (!object_dynamic_cast(OBJECT(cpu), ms->cpu_type)) {
+        error_setg(errp, "Invalid CPU type, expected cpu type: '%s'",
+                   ms->cpu_type);
+        return;
+    }
+
     /* if APIC ID is not set, set it based on socket/core/thread properties */
     if (cpu->apic_id == UNASSIGNED_APIC_ID) {
         int max_socket = (max_cpus - 1) / smp_threads / smp_cores;
-- 
2.7.4


Re: [Qemu-devel] [PATCH v2] pc: make sure that plugged CPUs are of the same type
Posted by Michael S. Tsirkin 6 years, 6 months ago
On Tue, Oct 10, 2017 at 05:17:40PM +0200, Igor Mammedov wrote:
> heterogeneous cpus are not supported and hotplugging different
> cpu model crashes QEMU:
> 
>   qemu-system-x86_64 -cpu qemu64 -smp 1,maxcpus=2
>   (qemu) device_add host-x86_64-cpu,socket-id=1,core-id=0,thread-id=0,id=foo
>   (qemu) info cpus
>   error: failed to get MSR 0x38d
>   qemu-system-x86_64: target/i386/kvm.c:2121: kvm_get_msrs: Assertion `ret == cpu->kvm_msr_buf->nmsrs' failed.
>   Aborted (core dumped)
> 
> Gracefully fail hotplug process in case of user mistake.
> 
> Reported-by: Greg Kurz <groug@kaod.org>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Acked-by: Michael S. Tsirkin <mst@redhat.com>

IIUC Paolo's merging this.

> ---
> v2:
>   fix checkpatch error
> ---
>  hw/i386/pc.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index 05985d4..8e307f7 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1876,8 +1876,15 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
>      CPUArchId *cpu_slot;
>      X86CPUTopoInfo topo;
>      X86CPU *cpu = X86_CPU(dev);
> +    MachineState *ms = MACHINE(hotplug_dev);
>      PCMachineState *pcms = PC_MACHINE(hotplug_dev);
>  
> +    if (!object_dynamic_cast(OBJECT(cpu), ms->cpu_type)) {
> +        error_setg(errp, "Invalid CPU type, expected cpu type: '%s'",
> +                   ms->cpu_type);
> +        return;
> +    }
> +
>      /* if APIC ID is not set, set it based on socket/core/thread properties */
>      if (cpu->apic_id == UNASSIGNED_APIC_ID) {
>          int max_socket = (max_cpus - 1) / smp_threads / smp_cores;
> -- 
> 2.7.4

Re: [Qemu-devel] [PATCH v2] pc: make sure that plugged CPUs are of the same type
Posted by Greg Kurz 6 years, 6 months ago
On Tue, 10 Oct 2017 17:17:40 +0200
Igor Mammedov <imammedo@redhat.com> wrote:

> heterogeneous cpus are not supported and hotplugging different
> cpu model crashes QEMU:
> 
>   qemu-system-x86_64 -cpu qemu64 -smp 1,maxcpus=2
>   (qemu) device_add host-x86_64-cpu,socket-id=1,core-id=0,thread-id=0,id=foo
>   (qemu) info cpus
>   error: failed to get MSR 0x38d
>   qemu-system-x86_64: target/i386/kvm.c:2121: kvm_get_msrs: Assertion `ret == cpu->kvm_msr_buf->nmsrs' failed.
>   Aborted (core dumped)
> 
> Gracefully fail hotplug process in case of user mistake.
> 
> Reported-by: Greg Kurz <groug@kaod.org>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> v2:
>   fix checkpatch error
> ---

(qemu) device_add host-x86_64-cpu,socket-id=1,core-id=0,thread-id=0,id=foo  
Invalid CPU type, expected cpu type: 'qemu64-x86_64-cpu'

Tested-by: Greg Kurz <groug@kaod.org>

>  hw/i386/pc.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index 05985d4..8e307f7 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1876,8 +1876,15 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
>      CPUArchId *cpu_slot;
>      X86CPUTopoInfo topo;
>      X86CPU *cpu = X86_CPU(dev);
> +    MachineState *ms = MACHINE(hotplug_dev);
>      PCMachineState *pcms = PC_MACHINE(hotplug_dev);
>  
> +    if (!object_dynamic_cast(OBJECT(cpu), ms->cpu_type)) {
> +        error_setg(errp, "Invalid CPU type, expected cpu type: '%s'",
> +                   ms->cpu_type);
> +        return;
> +    }
> +
>      /* if APIC ID is not set, set it based on socket/core/thread properties */
>      if (cpu->apic_id == UNASSIGNED_APIC_ID) {
>          int max_socket = (max_cpus - 1) / smp_threads / smp_cores;