From: Bibo Mao <maob...@loongson.cn> 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 <maob...@loongson.cn> Reviewed-by: Igor Mammedov <imamm...@redhat.com> Tested-by: Song Gao <gaos...@loongson.cn> Message-ID: <20250906070200.3749326-4-maob...@loongson.cn> Signed-off-by: Song Gao <gaos...@loongson.cn> --- 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.47.0