Re: WARNING in do_jobctl_trap

From: Dmitry Vyukov
Date: Thu Mar 10 2016 - 13:34:29 EST


On Wed, Jan 27, 2016 at 5:04 PM, Oleg Nesterov <oleg@xxxxxxxxxx> 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.