Message ID | 20220323171751.78612-11-philippe.mathieu.daude@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | accel: Fix vCPU memory leaks | expand |
On 3/23/22 10:17, Philippe Mathieu-Daudé wrote: > From: Philippe Mathieu-Daudé <f4bug@amsat.org> > > Introduce an empty common_vcpu_thread_destroy() function, and > provide a AccelOpsClass::destroy_vcpu_thread_precheck() callback > so accelerators can choose whether to call common_vcpu_thread_destroy. > > Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> > --- > include/sysemu/accel-ops.h | 2 ++ > softmmu/cpus.c | 9 +++++++++ > 2 files changed, 11 insertions(+) My comments here are similar to the create precheck hook. Do not add a "precheck" hook, but simply a hook to perform the whole job. r~
diff --git a/include/sysemu/accel-ops.h b/include/sysemu/accel-ops.h index caf337f61f..b47f6de3f9 100644 --- a/include/sysemu/accel-ops.h +++ b/include/sysemu/accel-ops.h @@ -35,6 +35,8 @@ struct AccelOpsClass { /* If non-NULL, return whether common vCPU thread must be created */ bool (*create_vcpu_thread_precheck)(CPUState *cpu); void (*create_vcpu_thread_postcheck)(CPUState *cpu); + /* If non-NULL, return whether common vCPU thread must be destroyed */ + bool (*destroy_vcpu_thread_precheck)(CPUState *cpu); void (*kick_vcpu_thread)(CPUState *cpu); bool (*cpu_thread_is_idle)(CPUState *cpu); diff --git a/softmmu/cpus.c b/softmmu/cpus.c index cf430ac486..37325b3b8d 100644 --- a/softmmu/cpus.c +++ b/softmmu/cpus.c @@ -617,6 +617,10 @@ static void common_vcpu_thread_create(CPUState *cpu) #endif } +static void common_vcpu_thread_destroy(CPUState *cpu) +{ +} + void cpu_remove_sync(CPUState *cpu) { cpu->stop = true; @@ -625,6 +629,11 @@ void cpu_remove_sync(CPUState *cpu) qemu_mutex_unlock_iothread(); qemu_thread_join(cpu->thread); qemu_mutex_lock_iothread(); + + if (cpus_accel->destroy_vcpu_thread_precheck == NULL + || cpus_accel->destroy_vcpu_thread_precheck(cpu)) { + common_vcpu_thread_destroy(cpu); + } } void cpus_register_accel(const AccelOpsClass *ops)