• T
    job control: introduce JOBCTL_TRAP_STOP and use it for group stop trap · 73ddff2b
    Tejun Heo 提交于
    do_signal_stop() implemented both normal group stop and trap for group
    stop while ptraced.  This approach has been enough but scheduled
    changes require trap mechanism which can be used in more generic
    manner and using group stop trap for generic trap site simplifies both
    userland visible interface and implementation.
    
    This patch adds a new jobctl flag - JOBCTL_TRAP_STOP.  When set, it
    triggers a trap site, which behaves like group stop trap, in
    get_signal_to_deliver() after checking for pending signals.  While
    ptraced, do_signal_stop() doesn't stop itself.  It initiates group
    stop if requested and schedules JOBCTL_TRAP_STOP and returns.  The
    caller - get_signal_to_deliver() - is responsible for checking whether
    TRAP_STOP is pending afterwards and handling it.
    
    ptrace_attach() is updated to use JOBCTL_TRAP_STOP instead of
    JOBCTL_STOP_PENDING and __ptrace_unlink() to clear all pending trap
    bits and TRAPPING so that TRAP_STOP and future trap bits don't linger
    after detach.
    
    While at it, add proper function comment to do_signal_stop() and make
    it return bool.
    
    -v2: __ptrace_unlink() updated to clear JOBCTL_TRAP_MASK and TRAPPING
         instead of JOBCTL_PENDING_MASK.  This avoids accidentally
         clearing JOBCTL_STOP_CONSUME.  Spotted by Oleg.
    
    -v3: do_signal_stop() updated to return %false without dropping
         siglock while ptraced and TRAP_STOP check moved inside for(;;)
         loop after group stop participation.  This avoids unnecessary
         relocking and also will help avoiding unnecessary traps by
         consuming group stop before handling pending traps.
    
    -v4: Jobctl trap handling moved into a separate function -
         do_jobctl_trap().
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Cc: Oleg Nesterov <oleg@redhat.com>
    73ddff2b
sched.h 79.1 KB