Messages in this thread Patch in this message | | | Date | Wed, 27 Jan 2016 17:04:57 +0100 | From | Oleg Nesterov <> | Subject | Re: WARNING in do_jobctl_trap |
| |
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...
Oleg.
| |