Forgot to mention, I did a lot of testing on ppc machine and the patch helps, finally I was able to reproduce the problem.
But I failed to install the kernel on Cai's machine, perhaps he could test the patch too ;) fighting with rhts machines is very tiresome and time consuming... I'll send the promised patch which kills supress_sigtrap() tomorrow, it needs testing/checking. On 12/04, Oleg Nesterov wrote: > > On 12/04, Roland McGrath wrote: > > > > > I think the problem is clear now. > > > > Ok. We should probably move this discussion to utrace-devel. > > Yes, I didn't notice we discuss this offlist... > > > > I forgot that there is another issue (iirc a bit discussed too). > > > finish_callback_report() sets ->ops = utrace_detached_ops lockless! > > > > You'll have to remind me why this is a problem. > > Re: [PATCH 85] ptrace_attach_task: rely on utrace_barrier(), don't > check ->ops > https://www.redhat.com/archives/utrace-devel/2009-October/msg00180.html > > We already discussed this, but forgot to finish. > > Do you agree with the patch? > > ------------------------------------------------------------------------------ > [PATCH] utrace: don't set ->ops = utrace_detached_ops lockless > > finish_callback_report() changes ->ops lockless. Imho this is not > right "in general", the state of !EXIT_DEAD tracee must be stable > under utrace->lock. > > And this can confuse ptrace_reuse_engine()->utrace_barrier() logic. > utrace_barrier() can race with reporting loop and return 0 while > engine was already detached or in the middle of detach. > > See also > https://www.redhat.com/archives/utrace-devel/2009-October/msg00180.html > > Signed-off-by: Oleg Nesterov <o...@redhat.com> > --- > > kernel/utrace.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > --- UTRACE-PTRACE/kernel/utrace.c~DONT_CHANGE_OPS_LOCKLESS 2009-11-24 > 17:20:33.000000000 +0100 > +++ UTRACE-PTRACE/kernel/utrace.c 2009-12-04 17:10:37.000000000 +0100 > @@ -1390,11 +1390,15 @@ static inline void finish_callback_repor > struct utrace_engine *engine, > enum utrace_resume_action action) > { > + if (action == UTRACE_DETACH) { > + spin_lock(&utrace->lock); > + engine->ops = &utrace_detached_ops; > + spin_unlock(&utrace->lock); > + } > /* > * If utrace_control() was used, treat that like UTRACE_DETACH here. > */ > - if (action == UTRACE_DETACH || engine->ops == &utrace_detached_ops) { > - engine->ops = &utrace_detached_ops; > + if (engine->ops == &utrace_detached_ops) { > report->detaches = true; > return; > }