With cpu hotplug is implemented on LoongArch virt machine, reset
interface with hot-added CPU should be registered. Otherwise there
will be problem if system reboots after cpu is hot-added.
Now register reset interface with CPU plug callback, so that all
cold/hot added CPUs let their reset interface registered. And remove
reset interface with CPU unplug callback.
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
---
hw/loongarch/boot.c | 13 -------------
hw/loongarch/virt.c | 2 ++
2 files changed, 2 insertions(+), 13 deletions(-)
diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
index 5799b4c75c..a516415822 100644
--- a/hw/loongarch/boot.c
+++ b/hw/loongarch/boot.c
@@ -350,13 +350,6 @@ static int64_t load_kernel_info(struct loongarch_boot_info *info)
return kernel_entry;
}
-static void reset_load_elf(void *opaque)
-{
- LoongArchCPU *cpu = opaque;
-
- cpu_reset(CPU(cpu));
-}
-
static void fw_cfg_add_kernel_info(struct loongarch_boot_info *info,
FWCfgState *fw_cfg)
{
@@ -439,12 +432,6 @@ static void loongarch_direct_kernel_boot(MachineState *ms,
void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info)
{
LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(ms);
- int i;
-
- /* register reset function */
- for (i = 0; i < ms->smp.cpus; i++) {
- qemu_register_reset(reset_load_elf, LOONGARCH_CPU(qemu_get_cpu(i)));
- }
info->kernel_filename = ms->kernel_filename;
info->kernel_cmdline = ms->kernel_cmdline;
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 31215b7785..bd5cff1f1e 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -1014,6 +1014,7 @@ static void virt_cpu_unplug(HotplugHandler *hotplug_dev,
/* Notify acpi ged CPU removed */
hotplug_handler_unplug(HOTPLUG_HANDLER(lvms->acpi_ged), dev, &error_abort);
+ qemu_unregister_resettable(OBJECT(dev));
cpu_slot = virt_find_cpu_slot(MACHINE(lvms), cpu->phy_id);
cpu_slot->cpu = NULL;
}
@@ -1038,6 +1039,7 @@ static void virt_cpu_plug(HotplugHandler *hotplug_dev,
&error_abort);
}
+ qemu_register_resettable(OBJECT(dev));
cpu_slot = virt_find_cpu_slot(MACHINE(lvms), cpu->phy_id);
cpu_slot->cpu = CPU(dev);
}
--
2.39.3
在 2025/9/6 下午3:02, Bibo Mao 写道:
> With cpu hotplug is implemented on LoongArch virt machine, reset
> interface with hot-added CPU should be registered. Otherwise there
> will be problem if system reboots after cpu is hot-added.
>
> Now register reset interface with CPU plug callback, so that all
> cold/hot added CPUs let their reset interface registered. And remove
> reset interface with CPU unplug callback.
>
> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
> Reviewed-by: Igor Mammedov <imammedo@redhat.com>
> ---
> hw/loongarch/boot.c | 13 -------------
> hw/loongarch/virt.c | 2 ++
> 2 files changed, 2 insertions(+), 13 deletions(-)
Tested-by: Song Gao <gaosong@loongson.cn>
Thanks.
Song Gao
> diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
> index 5799b4c75c..a516415822 100644
> --- a/hw/loongarch/boot.c
> +++ b/hw/loongarch/boot.c
> @@ -350,13 +350,6 @@ static int64_t load_kernel_info(struct loongarch_boot_info *info)
> return kernel_entry;
> }
>
> -static void reset_load_elf(void *opaque)
> -{
> - LoongArchCPU *cpu = opaque;
> -
> - cpu_reset(CPU(cpu));
> -}
> -
> static void fw_cfg_add_kernel_info(struct loongarch_boot_info *info,
> FWCfgState *fw_cfg)
> {
> @@ -439,12 +432,6 @@ static void loongarch_direct_kernel_boot(MachineState *ms,
> void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info)
> {
> LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(ms);
> - int i;
> -
> - /* register reset function */
> - for (i = 0; i < ms->smp.cpus; i++) {
> - qemu_register_reset(reset_load_elf, LOONGARCH_CPU(qemu_get_cpu(i)));
> - }
>
> info->kernel_filename = ms->kernel_filename;
> info->kernel_cmdline = ms->kernel_cmdline;
> diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
> index 31215b7785..bd5cff1f1e 100644
> --- a/hw/loongarch/virt.c
> +++ b/hw/loongarch/virt.c
> @@ -1014,6 +1014,7 @@ static void virt_cpu_unplug(HotplugHandler *hotplug_dev,
> /* Notify acpi ged CPU removed */
> hotplug_handler_unplug(HOTPLUG_HANDLER(lvms->acpi_ged), dev, &error_abort);
>
> + qemu_unregister_resettable(OBJECT(dev));
> cpu_slot = virt_find_cpu_slot(MACHINE(lvms), cpu->phy_id);
> cpu_slot->cpu = NULL;
> }
> @@ -1038,6 +1039,7 @@ static void virt_cpu_plug(HotplugHandler *hotplug_dev,
> &error_abort);
> }
>
> + qemu_register_resettable(OBJECT(dev));
> cpu_slot = virt_find_cpu_slot(MACHINE(lvms), cpu->phy_id);
> cpu_slot->cpu = CPU(dev);
> }
© 2016 - 2026 Red Hat, Inc.