On 05/05, Eric W. Biederman wrote: > > static void ptrace_unfreeze_traced(struct task_struct *task) > { > - if (READ_ONCE(task->__state) != __TASK_TRACED) > - return; > - > - WARN_ON(!task->ptrace || task->parent != current); > + unsigned long flags; > > /* > - * PTRACE_LISTEN can allow ptrace_trap_notify to wake us up remotely. > - * Recheck state under the lock to close this race. > + * The child may be awake and may have cleared > + * JOBCTL_PTRACE_FROZEN (see ptrace_resume). The child will > + * not set JOBCTL_PTRACE_FROZEN or enter __TASK_TRACED anew. > */ > - spin_lock_irq(&task->sighand->siglock); > - if (READ_ONCE(task->__state) == __TASK_TRACED) { > + if (lock_task_sighand(task, &flags)) {
But I still think that a lockless if (!(task->jobctl & JOBCTL_PTRACE_FROZEN)) return; check at the start of ptrace_unfreeze_traced() makes sense to avoid lock_task_sighand() if possible. And ptrace_resume() can probably clear JOBCTL_PTRACE_FROZEN along with JOBCTL_TRACED to make this optimization work better. The same for ptrace_signal_wake_up(). Oleg. _______________________________________________ linux-um mailing list linux-um@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-um