Message ID | 20230124201019.3935934-1-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | linux-user: un-parent OBJECT(cpu) when closing thread | expand |
Le 24/01/2023 à 21:10, Richard Henderson a écrit : > This reinstates commit 52f0c1607671293afcdb2acc2f83e9bccbfa74bb: > > While forcing the CPU to unrealize by hand does trigger the clean-up > code we never fully free resources because refcount never reaches > zero. This is because QOM automatically added objects without an > explicit parent to /unattached/, incrementing the refcount. > > Instead of manually triggering unrealization just unparent the object > and let the device machinery deal with that for us. > > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/866 > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > Reviewed-by: Laurent Vivier <laurent@vivier.eu> > Message-Id: <20220811151413.3350684-2-alex.bennee@linaro.org> > > The original patch tickled a problem in target/arm, and was reverted. > But that problem is fixed as of commit 3b07a936d3bf. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > linux-user/syscall.c | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index 1f8c10f8ef..4ca1b59343 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -8642,7 +8642,13 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1, > if (CPU_NEXT(first_cpu)) { > TaskState *ts = cpu->opaque; > > - object_property_set_bool(OBJECT(cpu), "realized", false, NULL); > + if (ts->child_tidptr) { > + put_user_u32(0, ts->child_tidptr); > + do_sys_futex(g2h(cpu, ts->child_tidptr), > + FUTEX_WAKE, INT_MAX, NULL, NULL, 0); > + } > + > + object_unparent(OBJECT(cpu)); > object_unref(OBJECT(cpu)); > /* > * At this point the CPU should be unrealized and removed > @@ -8652,11 +8658,6 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1, > > pthread_mutex_unlock(&clone_lock); > > - if (ts->child_tidptr) { > - put_user_u32(0, ts->child_tidptr); > - do_sys_futex(g2h(cpu, ts->child_tidptr), > - FUTEX_WAKE, INT_MAX, NULL, NULL, 0); > - } > thread_cpu = NULL; > g_free(ts); > rcu_unregister_thread(); Applied to my linux-user-for-8.0 branch. Thanks, Laurent
diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 1f8c10f8ef..4ca1b59343 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -8642,7 +8642,13 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1, if (CPU_NEXT(first_cpu)) { TaskState *ts = cpu->opaque; - object_property_set_bool(OBJECT(cpu), "realized", false, NULL); + if (ts->child_tidptr) { + put_user_u32(0, ts->child_tidptr); + do_sys_futex(g2h(cpu, ts->child_tidptr), + FUTEX_WAKE, INT_MAX, NULL, NULL, 0); + } + + object_unparent(OBJECT(cpu)); object_unref(OBJECT(cpu)); /* * At this point the CPU should be unrealized and removed @@ -8652,11 +8658,6 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1, pthread_mutex_unlock(&clone_lock); - if (ts->child_tidptr) { - put_user_u32(0, ts->child_tidptr); - do_sys_futex(g2h(cpu, ts->child_tidptr), - FUTEX_WAKE, INT_MAX, NULL, NULL, 0); - } thread_cpu = NULL; g_free(ts); rcu_unregister_thread();