target/loongarch/cpu.h | 1 + target/loongarch/kvm/kvm.c | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-)
When the cpu is created, qemu_add_vm_change_state_handler
is called in the kvm_arch_init_vcpu function to create
the VMChangeStateEntry resource.
However, the resource is not released when the cpu is destroyed.
This results in a qemu process segment error when the virtual
machine restarts after the cpu is unplugged.
This patch solves the problem by adding the corresponding resource
release process to the kvm_arch_destroy_vcpu function.
Signed-off-by: Xianglai Li <lixianglai@loongson.cn>
---
Cc: Bibo Mao <maobibo@loongson.cn>
Cc: Song Gao <gaosong@loongson.cn>
Cc: Xianglai Li <lixianglai@loongson.cn>
target/loongarch/cpu.h | 1 +
target/loongarch/kvm/kvm.c | 7 ++++++-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
index eae874c67b..254e4fbdcd 100644
--- a/target/loongarch/cpu.h
+++ b/target/loongarch/cpu.h
@@ -426,6 +426,7 @@ struct ArchCPU {
const char *dtb_compatible;
/* used by KVM_REG_LOONGARCH_COUNTER ioctl to access guest time counters */
uint64_t kvm_state_counter;
+ VMChangeStateEntry *vmsentry;
};
/**
diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c
index 7f63e7c8fe..f0e3cfef03 100644
--- a/target/loongarch/kvm/kvm.c
+++ b/target/loongarch/kvm/kvm.c
@@ -1080,8 +1080,10 @@ int kvm_arch_init_vcpu(CPUState *cs)
uint64_t val;
int ret;
Error *local_err = NULL;
+ LoongArchCPU *cpu = LOONGARCH_CPU(cs);
- qemu_add_vm_change_state_handler(kvm_loongarch_vm_stage_change, cs);
+ cpu->vmsentry = qemu_add_vm_change_state_handler(
+ kvm_loongarch_vm_stage_change, cs);
if (!kvm_get_one_reg(cs, KVM_REG_LOONGARCH_DEBUG_INST, &val)) {
brk_insn = val;
@@ -1197,6 +1199,9 @@ void kvm_loongarch_cpu_post_init(LoongArchCPU *cpu)
int kvm_arch_destroy_vcpu(CPUState *cs)
{
+ LoongArchCPU *cpu = LOONGARCH_CPU(cs);
+
+ qemu_del_vm_change_state_handler(cpu->vmsentry);
return 0;
}
--
2.39.1
On 2025/3/24 下午8:33, Xianglai Li wrote: > When the cpu is created, qemu_add_vm_change_state_handler > is called in the kvm_arch_init_vcpu function to create > the VMChangeStateEntry resource. > > However, the resource is not released when the cpu is destroyed. > This results in a qemu process segment error when the virtual > machine restarts after the cpu is unplugged. > > This patch solves the problem by adding the corresponding resource > release process to the kvm_arch_destroy_vcpu function. > > Signed-off-by: Xianglai Li <lixianglai@loongson.cn> > --- > Cc: Bibo Mao <maobibo@loongson.cn> > Cc: Song Gao <gaosong@loongson.cn> > Cc: Xianglai Li <lixianglai@loongson.cn> > > target/loongarch/cpu.h | 1 + > target/loongarch/kvm/kvm.c | 7 ++++++- > 2 files changed, 7 insertions(+), 1 deletion(-) > > diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h > index eae874c67b..254e4fbdcd 100644 > --- a/target/loongarch/cpu.h > +++ b/target/loongarch/cpu.h > @@ -426,6 +426,7 @@ struct ArchCPU { > const char *dtb_compatible; > /* used by KVM_REG_LOONGARCH_COUNTER ioctl to access guest time counters */ > uint64_t kvm_state_counter; > + VMChangeStateEntry *vmsentry; > }; > > /** > diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c > index 7f63e7c8fe..f0e3cfef03 100644 > --- a/target/loongarch/kvm/kvm.c > +++ b/target/loongarch/kvm/kvm.c > @@ -1080,8 +1080,10 @@ int kvm_arch_init_vcpu(CPUState *cs) > uint64_t val; > int ret; > Error *local_err = NULL; > + LoongArchCPU *cpu = LOONGARCH_CPU(cs); > > - qemu_add_vm_change_state_handler(kvm_loongarch_vm_stage_change, cs); > + cpu->vmsentry = qemu_add_vm_change_state_handler( > + kvm_loongarch_vm_stage_change, cs); > > if (!kvm_get_one_reg(cs, KVM_REG_LOONGARCH_DEBUG_INST, &val)) { > brk_insn = val; > @@ -1197,6 +1199,9 @@ void kvm_loongarch_cpu_post_init(LoongArchCPU *cpu) > > int kvm_arch_destroy_vcpu(CPUState *cs) > { > + LoongArchCPU *cpu = LOONGARCH_CPU(cs); > + > + qemu_del_vm_change_state_handler(cpu->vmsentry); > return 0; > } > > Reviewed-by: Bibo Mao <maobibo@loongson.cn>
© 2016 - 2025 Red Hat, Inc.