[PATCH] target/loongarch: Fix the cpu unplug resource leak

Xianglai Li posted 1 patch 5 days, 18 hours ago
target/loongarch/cpu.h     | 1 +
target/loongarch/kvm/kvm.c | 7 ++++++-
2 files changed, 7 insertions(+), 1 deletion(-)
[PATCH] target/loongarch: Fix the cpu unplug resource leak
Posted by Xianglai Li 5 days, 18 hours ago
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
Re: [PATCH] target/loongarch: Fix the cpu unplug resource leak
Posted by bibo mao 4 days, 21 hours ago

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>