From 7efd5d829730d0481659cda91f725df3b141f469 Mon Sep 17 00:00:00 2001 From: Salil Mehta Date: Tue, 16 Jul 2024 12:15:01 +0100 Subject: [PATCH 66/78] physmem: Add helper function to destroy CPU AddressSpace Virtual CPU Hot-unplug leads to unrealization of a CPU object. This also involves destruction of the CPU AddressSpace. Add common function to help destroy the CPU AddressSpace. Signed-off-by: Salil Mehta Tested-by: Vishnu Pajjuri Reviewed-by: Gavin Shan Tested-by: Xianglai Li Tested-by: Miguel Luis Reviewed-by: Shaoqin Huang Tested-by: Zhao Liu Acked-by: Igor Mammedov Message-Id: <20240716111502.202344-7-salil.mehta@huawei.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin Signed-off-by: Xianglai Li --- include/hw/core/cpu.h | 4 ++-- system/physmem.c | 18 +++++++++++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h index ee04ee44c2..37f3a469c8 100644 --- a/include/hw/core/cpu.h +++ b/include/hw/core/cpu.h @@ -495,8 +495,8 @@ struct CPUState { QemuMutex work_mutex; QSIMPLEQ_HEAD(, qemu_work_item) work_list; - CPUAddressSpace *cpu_ases; - int cpu_ases_ref_count; + struct CPUAddressSpace *cpu_ases; + int cpu_ases_count; int num_ases; AddressSpace *as; MemoryRegion *memory; diff --git a/system/physmem.c b/system/physmem.c index 2c8b83f811..c50ac24786 100644 --- a/system/physmem.c +++ b/system/physmem.c @@ -761,7 +761,7 @@ void cpu_address_space_init(CPUState *cpu, int asidx, if (!cpu->cpu_ases) { cpu->cpu_ases = g_new0(CPUAddressSpace, cpu->num_ases); - cpu->cpu_ases_ref_count = cpu->num_ases; + cpu->cpu_ases_count = cpu->num_ases; } newas = &cpu->cpu_ases[asidx]; @@ -779,24 +779,28 @@ void cpu_address_space_destroy(CPUState *cpu, int asidx) { CPUAddressSpace *cpuas; - assert(asidx < cpu->num_ases); - assert(asidx == 0 || !kvm_enabled()); assert(cpu->cpu_ases); + assert(asidx >= 0 && asidx < cpu->num_ases); + /* KVM cannot currently support multiple address spaces. */ + assert(asidx == 0 || !kvm_enabled()); cpuas = &cpu->cpu_ases[asidx]; if (tcg_enabled()) { memory_listener_unregister(&cpuas->tcg_as_listener); } - cpuas->as->free_in_rcu = true; address_space_destroy(cpuas->as); + g_free_rcu(cpuas->as, rcu); - if (cpu->cpu_ases_ref_count == 1) { + if (asidx == 0) { + /* reset the convenience alias for address space 0 */ + cpu->as = NULL; + } + + if (--cpu->cpu_ases_count == 0) { g_free(cpu->cpu_ases); cpu->cpu_ases = NULL; } - - cpu->cpu_ases_ref_count--; } AddressSpace *cpu_get_address_space(CPUState *cpu, int asidx) -- 2.39.1