• Linus Torvalds's avatar
    Merge tag 'ptrace_stop-cleanup-for-v5.19' of... · 67850b7b
    Linus Torvalds authored
    Merge tag 'ptrace_stop-cleanup-for-v5.19' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
    
    Pull ptrace_stop cleanups from Eric Biederman:
     "While looking at the ptrace problems with PREEMPT_RT and the problems
      Peter Zijlstra was encountering with ptrace in his freezer rewrite I
      identified some cleanups to ptrace_stop that make sense on their own
      and move make resolving the other problems much simpler.
    
      The biggest issue is the habit of the ptrace code to change
      task->__state from the tracer to suppress TASK_WAKEKILL from waking up
      the tracee. No other code in the kernel does that and it is straight
      forward to update signal_wake_up and friends to make that unnecessary.
    
      Peter's task freezer sets frozen tasks to a new state TASK_FROZEN and
      then it stores them by calling "wake_up_state(t, TASK_FROZEN)" relying
      on the fact that all stopped states except the special stop states can
      tolerate spurious wake up and recover their state.
    
      The state of stopped and traced tasked is changed to be stored in
      task->jobctl as well as in task->__state. This makes it possible for
      the freezer to recover tasks in these special states, as well as
      serving as a general cleanup. With a little more work in that
      direction I believe TASK_STOPPED can learn to tolerate spurious wake
      ups and become an ordinary stop state.
    
      The TASK_TRACED state has to remain a special state as the registers
      for a process are only reliably available when the process is stopped
      in the scheduler. Fundamentally ptrace needs acess to the saved
      register values of a task.
    
      There are bunch of semi-random ptrace related cleanups that were found
      while looking at these issues.
    
      One cleanup that deserves to be called out is from commit 57b6de08
      ("ptrace: Admit ptrace_stop can generate spuriuos SIGTRAPs"). This
      makes a change that is technically user space visible, in the handling
      of what happens to a tracee when a tracer dies unexpectedly. According
      to our testing and our understanding of userspace nothing cares that
      spurious SIGTRAPs can be generated in that case"
    
    * tag 'ptrace_stop-cleanup-for-v5.19' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace:
      sched,signal,ptrace: Rework TASK_TRACED, TASK_STOPPED state
      ptrace: Always take siglock in ptrace_resume
      ptrace: Don't change __state
      ptrace: Admit ptrace_stop can generate spuriuos SIGTRAPs
      ptrace: Document that wait_task_inactive can't fail
      ptrace: Reimplement PTRACE_KILL by always sending SIGKILL
      signal: Use lockdep_assert_held instead of assert_spin_locked
      ptrace: Remove arch_ptrace_attach
      ptrace/xtensa: Replace PT_SINGLESTEP with TIF_SINGLESTEP
      ptrace/um: Replace PT_DTRACE with TIF_SINGLESTEP
      signal: Replace __group_send_sig_info with send_signal_locked
      signal: Rename send_signal send_signal_locked
    67850b7b
ptrace.c 51.2 KB