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;
>       }

Reply via email to