On Thu, 4 Sep 2025 19:55:49 +0800
Bibo Mao <maob...@loongson.cn> wrote:

> On 2025/9/4 下午4:13, Igor Mammedov wrote:
> > On Wed,  3 Sep 2025 10:35:56 +0800
> > Bibo Mao <maob...@loongson.cn> wrote:
> >   
> >> 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 object is realized and remove
> >> the reset interface with CPU object unrealizd.
> >>
> >> Signed-off-by: Bibo Mao <maob...@loongson.cn>
> >> ---
> >>   hw/loongarch/boot.c    | 13 -------------
> >>   target/loongarch/cpu.c |  4 ++++
> >>   2 files changed, 4 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/target/loongarch/cpu.c b/target/loongarch/cpu.c
> >> index 3a7621c0ea..9edb8ebc4d 100644
> >> --- a/target/loongarch/cpu.c
> >> +++ b/target/loongarch/cpu.c
> >> @@ -668,6 +668,9 @@ static void loongarch_cpu_realizefn(DeviceState *dev, 
> >> Error **errp)
> >>   
> >>       qemu_init_vcpu(cs);
> >>       cpu_reset(cs);
> >> + #ifndef CONFIG_USER_ONLY
> >> +    qemu_register_resettable(OBJECT(dev));
> >> + #endif  
> > 
> > I'd put this in virt_cpu_plug() as last step, which should work both for
> > cold and hotpluged cpus. And drop CONFIG_USER_ONLY while at it.  
> With symmetry is the same with qemu_unregister_resettable() 
> Symmetrically, to put it in virt_cpu_unplug()?

yep

> 
> If there are many boards in future, the boards do not need to care about 
> registering cpu reset interface, which is done in CPU object already.

lets worry about more boards when that arrives.
that said, yanking reset pin on CPU is usually the board/firmware 
responsibility.

PS:
we have reset registered in realizefn() across QEMU, largely due to historical 
reasons.

> 
> Regards
> Bibo Mao
> > 
> > with that
> > Reviewed-by: Igor Mammedov <imamm...@redhat.com>
> > 
> > PS:
> > the rest of the patches are very arch specific so I won't review them.
> >   
> >>   
> >>       lacc->parent_realize(dev, errp);
> >>   }
> >> @@ -678,6 +681,7 @@ static void loongarch_cpu_unrealizefn(DeviceState *dev)
> >>   
> >>   #ifndef CONFIG_USER_ONLY
> >>       cpu_remove_sync(CPU(dev));
> >> +    qemu_unregister_resettable(OBJECT(dev));
> >>   #endif
> >>   
> >>       lacc->parent_unrealize(dev);  
> >   
> 


Reply via email to