Q: utrace_attach_task && utrace_release_task
Oleg Nesterov
oleg at redhat.com
Thu Mar 5 21:02:01 UTC 2009
On 03/05, Roland McGrath wrote:
>
> > utrace_attach_task() checks ->exit_state == EXIT_DEAD. Why? I mean,
> > how can it help, we don't hold any locks, target can change its
> > ->exit_state right after the check.
>
> Good catch, thanks. This is a remnant of the utrace-indirect code,
> where utrace_first_engine() had an interlock with reap/release_task.
> (It's one of the several ways that arrangement is superior IMNSHO.)
>
> > I don't understand why utrace_release_task() doesn't set ->reap = 1
> > unconditionally. In that case we could use this flag instead of
> > EXIT_DEAD to verify it is "safe" to attach or get_utrace_lock().
>
> That's what I've made it do now. In the utrace-indirect setup,
> it was possible to avoid locks for the common case (nobody attached).
Aha, I see the new patches...
what about get_utrace_lock() ? Do we really need the EXI_DEAD check?
And this check looks "racy" too.
> > static inline int utrace_attach_delay(struct task_struct *target)
> [...]
>
> This is the same thing Ananth noticed. It was an unintended holdover from
> the utrace-indirect code organization. It's fixed now.
Great, but
utrace_attach_delay:
if (signal_pending(current))
return -ERESTARTNOINTR;
If utrace_attach_delay() fails, utrace_attach_task() returns this error.
This is right, but for example, prepare_ptrace_attach() will convert it
to EPERM?
Oleg.
More information about the utrace-devel
mailing list