77 lines
2.7 KiB
Diff
77 lines
2.7 KiB
Diff
|
|
From 2a51f062a46c2e3fbd96a1d75f9d53cab449f4ac Mon Sep 17 00:00:00 2001
|
||
|
|
From: Xianglai Li <lixianglai@loongson.cn>
|
||
|
|
Date: Fri, 21 Mar 2025 20:40:37 +0800
|
||
|
|
Subject: [PATCH] target/loongarch: Fix the cpu unplug resource leak
|
||
|
|
|
||
|
|
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>
|
||
|
|
---
|
||
|
|
target/loongarch/cpu.c | 2 +-
|
||
|
|
target/loongarch/cpu.h | 1 +
|
||
|
|
target/loongarch/kvm/kvm.c | 5 ++++-
|
||
|
|
3 files changed, 6 insertions(+), 2 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
|
||
|
|
index 570ce8be3b..561566f3a0 100644
|
||
|
|
--- a/target/loongarch/cpu.c
|
||
|
|
+++ b/target/loongarch/cpu.c
|
||
|
|
@@ -573,7 +573,7 @@ static void loongarch_cpu_reset_hold(Object *obj)
|
||
|
|
env->CSR_ECFG = FIELD_DP64(env->CSR_ECFG, CSR_ECFG, VS, 0);
|
||
|
|
env->CSR_ECFG = FIELD_DP64(env->CSR_ECFG, CSR_ECFG, LIE, 0);
|
||
|
|
|
||
|
|
- env->CSR_ESTAT = env->CSR_ESTAT & (~MAKE_64BIT_MASK(0, 2));
|
||
|
|
+ env->CSR_ESTAT = 0;
|
||
|
|
env->CSR_RVACFG = FIELD_DP64(env->CSR_RVACFG, CSR_RVACFG, RBITS, 0);
|
||
|
|
env->CSR_CPUID = cs->cpu_index;
|
||
|
|
env->CSR_TCFG = FIELD_DP64(env->CSR_TCFG, CSR_TCFG, EN, 0);
|
||
|
|
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
|
||
|
|
index 9af622aba5..6cc717c5ea 100644
|
||
|
|
--- a/target/loongarch/cpu.h
|
||
|
|
+++ b/target/loongarch/cpu.h
|
||
|
|
@@ -427,6 +427,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 277210ca04..f6e008a517 100644
|
||
|
|
--- a/target/loongarch/kvm/kvm.c
|
||
|
|
+++ b/target/loongarch/kvm/kvm.c
|
||
|
|
@@ -905,9 +905,10 @@ int kvm_arch_init_vcpu(CPUState *cs)
|
||
|
|
uint64_t val;
|
||
|
|
int ret;
|
||
|
|
Error *local_err = NULL;
|
||
|
|
+ LoongArchCPU *cpu = LOONGARCH_CPU(cs);
|
||
|
|
|
||
|
|
ret = 0;
|
||
|
|
- 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;
|
||
|
|
@@ -928,6 +929,8 @@ int kvm_arch_init_vcpu(CPUState *cs)
|
||
|
|
|
||
|
|
int kvm_arch_destroy_vcpu(CPUState *cs)
|
||
|
|
{
|
||
|
|
+ LoongArchCPU *cpu = LOONGARCH_CPU(cs);
|
||
|
|
+ qemu_del_vm_change_state_handler(cpu->vmsentry);
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|