| Date | Tue, 10 May 2022 16:23:18 +0200 | From | Oleg Nesterov <> | Subject | Re: [PATCH v4 10/12] ptrace: Don't change __state |
| |
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.
|