Hi,

So, the ptrace() hangs if we try to attach to stopped task from freezing cgroup.
It seems this was introduced by 5d8f72b55c2756("freezer: change 
ptrace_stop/do_signal_stop to use freezable_schedule()").
See below for the exact scenario and small script to reproduce this.


Tracee:                                                                 Tracer:
static bool do_signal_stop(int signr)
        __set_current_state(TASK_STOPPED);
        freezable_schedule();
                freezer_do_not_count();
                schedule(); /* waiting for wake up */

                                                                        
ptrace_attach()
                                                                                
if (task_is_stopped(task) &&
                                                                                
    task_set_jobctl_pending(task, JOBCTL_TRAP_STOP | JOBCTL_TRAPPING))
                                                                                
        signal_wake_up_state(task, __TASK_STOPPED);

                /* woken up by ptrace_attach() */
                freezer_count();
                        __refrigerator()
                                                                                
/* And here we will hang, because tracee is now frozen in __refrigerator() */
                                                                                
wait_on_bit(&task->jobctl, JOBCTL_TRAPPING_BIT,
                                                                                
                TASK_UNINTERRUPTIBLE);



Reproduecer:
-----------
#!/bin/bash                                                                     
                                                                                
                                                     

sleep 100 &
pid=$!
kill -SIGSTOP $pid
mkdir -p /sys/fs/cgroup/freezer/test
echo $pid > /sys/fs/cgroup/freezer/test/tasks
echo FROZEN > /sys/fs/cgroup/freezer/test/freezer.state

echo '#include <stdlib.h>                                                       
                                                                                
                                                     
#include <sys/ptrace.h>                                                         
                                                                                
                                                     
                                                                                
                                                                                
                                                     
int main(int argc, char  **argv)                                                
                                                                                
                                                     
{                                                                               
                                                                                
                                                     
  int pid = atoi(argv[1]);                                                      
                                                                                
                                                     
  return ptrace(PTRACE_SEIZE, pid, NULL, 0);                                    
                                                                                
                                                     
}                                                                               
                                                                                
                                                     
' | gcc -x c -
./a.out $pid


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to