On Wed, Jan 27, 2016 at 5:04 PM, Oleg Nesterov <[email protected]> wrote: > On 01/26, Oleg Nesterov wrote: >> >> On 01/26, Dmitry Vyukov wrote: >> > >> > Hello, >> > >> > The following program triggers WARN_ON_ONCE(!signr) in do_jobctl_trap: >> >> Can't reproduce, but most probably I understand the problem... I'll try to >> make the simplified test-case tomorrow, it should work if I am right. > > This triggers the same problem immediately: > > > #include <unistd.h> > #include <sys/ptrace.h> > #include <sys/wait.h> > > void test(void) > { > for (;;) { > if (fork()) { > wait(NULL); > continue; > } > > ptrace(PTRACE_SEIZE, getppid(), 0, 0); > ptrace(PTRACE_INTERRUPT, getppid(), 0, 0); > _exit(0); > } > } > > int main(void) > { > int np; > > for (np = 0; np < 8; ++np) > if (!fork()) > test(); > > while (wait(NULL) > 0) > ; > return 0; > } > > and just in case, your test-case works too if I run > > perl -e 'fork; fork; fork; 1 while 1' & > > in the background, it has too many delays to work on the idle system. > >> Does it work for you reliably? If yes, any chance you can try the patch >> below? >> >> Oleg. >> >> --- x/kernel/ptrace.c >> +++ x/kernel/ptrace.c >> @@ -73,11 +73,11 @@ void __ptrace_unlink(struct task_struct *child) >> { >> BUG_ON(!child->ptrace); >> >> - child->ptrace = 0; >> child->parent = child->real_parent; >> list_del_init(&child->ptrace_entry); >> >> spin_lock(&child->sighand->siglock); >> + child->ptrace = 0; >> >> /* >> * Clear all pending traps and TRAPPING. TRAPPING should be > > The change above helps, but I need to think more...
Hi Oleg, I am running with the __ptrace_unlink fix since then, and did not see any bugs. Please mail it a proper patch.

