Re: [PATCH 0.2/8] ptrace: Always put ptracee into appropriateexecution state

From: Tejun Heo
Date: Wed Mar 23 2011 - 04:00:22 EST


Hello,

On Tue, Mar 22, 2011 at 09:33:22PM +0100, Oleg Nesterov wrote:
> > + /*
> > + * Reinstate GROUP_STOP_PENDING if group stop is in effect and
> > + * @child isn't dead.
> > + */
> > + if (!(child->flags & PF_EXITING) &&
> > + (child->signal->flags & SIGNAL_STOP_STOPPED ||
> > + child->signal->group_stop_count))
> > + child->group_stop |= GROUP_STOP_PENDING;
>
> Why do we need to filter out PF_EXITING tasks? This doesn't look
> strictly necessary. And note that exit_signals() doesn't always
> take ->siglock, we can race anyway.

I don't think it's strictly necessary either but in the usual group
stop initiation path in do_signal_stop(), PF_EXITING is checked before
setting PENDING, so I think it's better to remain consistent with
that.

> > + * Note that @resume should be used iff @child
> > + * is in TASK_TRACED; otherwise, we might unduly disrupt
> > + * TASK_KILLABLE sleeps.
>
> Yes. but, just in case,
>
> > + */
> > + if (child->group_stop & GROUP_STOP_PENDING || task_is_traced(child))
> > + signal_wake_up(child, task_is_traced(child));
>
> signal_wake_up() is not needed if task_is_traced(). Even if we added
> GROUP_STOP_PENDING, ptrace_stop() does recalc_sigpending_tsk() anyway
> before return.
>
> So we could do
>
> if (SIGNAL_STOP_STOPPED || group_stop_count) {
> child->group_stop |= GROUP_STOP_PENDING;
> signal_wake_up(child, 0);
> }
>
> if (task_is_traced(child))
> wake_up_state(TASK_TRACED);
>
> But probably a single wakeup looks more simple/clean, so I agree.

Yeah, I'd like to avoid mixing calls to wake_up_state() and
signal_wake_up(). It gets confusing and there's no reason for
micro-optimization here.

Thanks.

--
tejun
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/