mbox series

[v4,0/6] hw/loongarch/virt: Add cpu hotplug support

Message ID 20241112021738.1952851-1-maobibo@loongson.cn
Headers show
Series hw/loongarch/virt: Add cpu hotplug support | expand

Message

Bibo Mao Nov. 12, 2024, 2:17 a.m. UTC
LoongArch cpu hotplug is based on ACPI GED device, there is a little
change about ipi and extioi device, the value of num-cpu property is
maximum cpu number rather than present cpu number.

It can be verified with qemu command:
  qemu-system-loongarch64 -smp 2,maxcpus=16,sockets=4,cores=4,threads=1
and vcpu can be added or remove with hmp command:
  device_add la464-loongarch-cpu,socket-id=0,core-id=2,thread-id=0,id=cpu-2
  device_del cpu-2

---
v3 ... v4:
  1. For cold-plug CPUs, move socket-id/core-id/thread-id property
     setting from preplug function to CPU object creating loop, since
     there is topo information calculation already in CPU object creating
     loop.
  2. Init interrupt pin of CPU object in cpu plug interface for both
     cold-plug CPUs and hot-plug CPUs.
  3. Apply the patch based on latest qemu version.

v2 ... v3:
  1. Use qdev_realize_and_unref() with qdev_realize() and object_unref().
  2. Set vcpus_count with 1 since vcpu object is created for every thread.
  3. Remove property hw-id, use internal variable hw_id to differentiate
     cold-plug cpus and hot-plug cpus.
  4. Add generic function virt_init_cpu_irq() to init interrupt pin
     of CPU object, used by both cold-plug and hot-plug CPUs

v1 ... v2:
  1. Add new property hw-id, property hw-id is set for cold-added CPUs,
     and property socket-id/core-id/thread-id is set for hot-added CPUs.
     The two properties can be generated from each other.
  2. Use general hotplug api such as hotplug_handler_pre_plug etc
  3. Reorganize the patch order, split the patch set into 4 small
     patches.
---
Bibo Mao (6):
  hw/loongarch/virt: Add CPU topology support
  hw/loongarch/virt: Implement cpu plug interface
  hw/loongarch/virt: Add generic function to init interrupt pin of CPU
  hw/loongarch/virt: Init interrupt pin of CPU during plug interface
  hw/loongarch/virt: Update the ACPI table for hotplug cpu
  hw/loongarch/virt: Enable cpu hotplug feature on virt machine

 docs/system/loongarch/virt.rst |  31 +++
 hw/loongarch/Kconfig           |   1 +
 hw/loongarch/acpi-build.c      |  35 ++-
 hw/loongarch/virt.c            | 374 ++++++++++++++++++++++++++++-----
 include/hw/loongarch/virt.h    |   3 +
 target/loongarch/cpu.c         |  25 +++
 target/loongarch/cpu.h         |  17 ++
 7 files changed, 428 insertions(+), 58 deletions(-)


base-commit: 134b443512825bed401b6e141447b8cdc22d2efe

Comments

Xianglai Li Nov. 29, 2024, 7:02 a.m. UTC | #1
Hello everyone, I have a question about cpu hotplug to consult you.

When I start qemu with the following parameters:
/usr/bin/qemu-system-loongarch64 \
-machine virt  \
-accel tcg \
-bios /usr/share/edk2/loongarch64/QEMU_EFI.fd \
-m size=1048576k \
-smp 1,maxcpus=4,cores=1,threads=1,sockets=4  \
-nographic \
-monitor telnet:localhost:4444,server,nowait \
-incoming tcp:0:6666 \
-serial stdio

The virtual machine is not running directly and is in the migration state,
At this point I insert a cpu using the following command:
telnet 127.0.0.1 4444
(qemu)  device_add 
la464-loongarch-cpu,socket-id=1,core-id=0,thread-id=0,id=cpu-1

I found that the ged device sends an interrupt signal to the interrupt 
controller,
My understanding is that the current machine is not in the running state,
whether the ged device should send interrupt signal in this state?

The "current_run_state" is  RUN_STATE_INMIGRATE,
And The "machine_phase" is PHASE_MACHINE_READY in qemu.

So do we need to add a conditional on current_run_state to the 
acpi_cpu_plug_cb function?
For example:

@@ -258,7 +258,8 @@ void acpi_cpu_plug_cb(HotplugHandler *hotplug_dev,
      }

      cdev->cpu = CPU(dev);
-    if (dev->hotplugged) {
+    if (dev->hotplugged &&
+        runstate_check(RUN_STATE_RUNNING)) {
          cdev->is_inserting = true;
          acpi_send_event(DEVICE(hotplug_dev), ACPI_CPU_HOTPLUG_STATUS);
      }


> LoongArch cpu hotplug is based on ACPI GED device, there is a little
> change about ipi and extioi device, the value of num-cpu property is
> maximum cpu number rather than present cpu number.
>
> It can be verified with qemu command:
>    qemu-system-loongarch64 -smp 2,maxcpus=16,sockets=4,cores=4,threads=1
> and vcpu can be added or remove with hmp command:
>    device_add la464-loongarch-cpu,socket-id=0,core-id=2,thread-id=0,id=cpu-2
>    device_del cpu-2
>
> ---
> v3 ... v4:
>    1. For cold-plug CPUs, move socket-id/core-id/thread-id property
>       setting from preplug function to CPU object creating loop, since
>       there is topo information calculation already in CPU object creating
>       loop.
>    2. Init interrupt pin of CPU object in cpu plug interface for both
>       cold-plug CPUs and hot-plug CPUs.
>    3. Apply the patch based on latest qemu version.
>
> v2 ... v3:
>    1. Use qdev_realize_and_unref() with qdev_realize() and object_unref().
>    2. Set vcpus_count with 1 since vcpu object is created for every thread.
>    3. Remove property hw-id, use internal variable hw_id to differentiate
>       cold-plug cpus and hot-plug cpus.
>    4. Add generic function virt_init_cpu_irq() to init interrupt pin
>       of CPU object, used by both cold-plug and hot-plug CPUs
>
> v1 ... v2:
>    1. Add new property hw-id, property hw-id is set for cold-added CPUs,
>       and property socket-id/core-id/thread-id is set for hot-added CPUs.
>       The two properties can be generated from each other.
>    2. Use general hotplug api such as hotplug_handler_pre_plug etc
>    3. Reorganize the patch order, split the patch set into 4 small
>       patches.
> ---
> Bibo Mao (6):
>    hw/loongarch/virt: Add CPU topology support
>    hw/loongarch/virt: Implement cpu plug interface
>    hw/loongarch/virt: Add generic function to init interrupt pin of CPU
>    hw/loongarch/virt: Init interrupt pin of CPU during plug interface
>    hw/loongarch/virt: Update the ACPI table for hotplug cpu
>    hw/loongarch/virt: Enable cpu hotplug feature on virt machine
>
>   docs/system/loongarch/virt.rst |  31 +++
>   hw/loongarch/Kconfig           |   1 +
>   hw/loongarch/acpi-build.c      |  35 ++-
>   hw/loongarch/virt.c            | 374 ++++++++++++++++++++++++++++-----
>   include/hw/loongarch/virt.h    |   3 +
>   target/loongarch/cpu.c         |  25 +++
>   target/loongarch/cpu.h         |  17 ++
>   7 files changed, 428 insertions(+), 58 deletions(-)
>
>
> base-commit: 134b443512825bed401b6e141447b8cdc22d2efe