Message ID | 20240519210620.228342-7-salil.mehta@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add architecture agnostic code to support vCPU Hotplug | expand |
On Mon May 20, 2024 at 7:06 AM AEST, Salil Mehta wrote: > 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. Patches 6,7 seem okay to me. I would like to see a series where they get used. Would it be possible to include at least a TCG user in your series? That would make it easier to review and test. Thanks, Nick
> From: Nicholas Piggin <npiggin@gmail.com> > Sent: Monday, May 20, 2024 9:19 AM > > On Mon May 20, 2024 at 7:06 AM AEST, Salil Mehta wrote: > > 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. > > Patches 6,7 seem okay to me. I would like to see a series where they get > used. Would it be possible to include at least a TCG user in your series? That > would make it easier to review and test. If you wish to play then you can use below repository which is V8 version of architecture agnostic patch-set plus architecture dependent patch-set stacked up together. This effectively RFC V2 rearranged with clear separation of arch agnostic and specific parts and some review comments incorporated. https://github.com/salil-mehta/qemu/commits/virt-cpuhp-armv8/rfc-v3-rc1/ It has TCG but it has some issues and hence we have disabled it for now. We are working to fix it. Thanks Salil. > > Thanks, > Nick
On Mon May 20, 2024 at 8:55 PM AEST, Salil Mehta wrote: > > From: Nicholas Piggin <npiggin@gmail.com> > > Sent: Monday, May 20, 2024 9:19 AM > > > > On Mon May 20, 2024 at 7:06 AM AEST, Salil Mehta wrote: > > > 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. > > > > Patches 6,7 seem okay to me. I would like to see a series where they get > > used. Would it be possible to include at least a TCG user in your series? That > > would make it easier to review and test. > > > If you wish to play then you can use below repository which is V8 version of > architecture agnostic patch-set plus architecture dependent patch-set > stacked up together. This effectively RFC V2 rearranged with clear separation > of arch agnostic and specific parts and some review comments incorporated. > > https://github.com/salil-mehta/qemu/commits/virt-cpuhp-armv8/rfc-v3-rc1/ > > > It has TCG but it has some issues and hence we have disabled it for now. We are > working to fix it. Thanks for the links, I will take a look. Thanks, Nick
diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h index 815342d043..240ee04369 100644 --- a/include/exec/cpu-common.h +++ b/include/exec/cpu-common.h @@ -129,6 +129,14 @@ size_t qemu_ram_pagesize_largest(void); */ void cpu_address_space_init(CPUState *cpu, int asidx, const char *prefix, MemoryRegion *mr); +/** + * cpu_address_space_destroy: + * @cpu: CPU for which address space needs to be destroyed + * @asidx: integer index of this address space + * + * Note that with KVM only one address space is supported. + */ +void cpu_address_space_destroy(CPUState *cpu, int asidx); void cpu_physical_memory_rw(hwaddr addr, void *buf, hwaddr len, bool is_write); diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h index bb398e8237..60b160d0b4 100644 --- a/include/hw/core/cpu.h +++ b/include/hw/core/cpu.h @@ -486,6 +486,7 @@ struct CPUState { QSIMPLEQ_HEAD(, qemu_work_item) work_list; 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 342b7a8fd4..146f17826a 100644 --- a/system/physmem.c +++ b/system/physmem.c @@ -763,6 +763,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_count = cpu->num_ases; } newas = &cpu->cpu_ases[asidx]; @@ -776,6 +777,34 @@ void cpu_address_space_init(CPUState *cpu, int asidx, } } +void cpu_address_space_destroy(CPUState *cpu, int asidx) +{ + CPUAddressSpace *cpuas; + + 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); + } + + address_space_destroy(cpuas->as); + g_free_rcu(cpuas->as, rcu); + + 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; + } +} + AddressSpace *cpu_get_address_space(CPUState *cpu, int asidx) { /* Return the AddressSpace corresponding to the specified index */