Re: [PATCH 1/1] freezer: change ptrace_stop/do_signal_stop to use freezable_schedule()
From: Oleg Nesterov <hidden>
Date: 2012-10-25 17:33:30
Also in:
lkml, stable
On 10/25, Tejun Heo wrote:
Hello, Oleg. On Thu, Oct 25, 2012 at 06:39:59PM +0200, Oleg Nesterov wrote:quoted
Change ptrace_stop() and do_signal_stop() to use freezable_schedule() rather than rely on subsequent try_to_freeze(). This allows to remove the task_is_stopped_or_traced() checks from try_to_freeze_tasks() and update_if_frozen(), and this fixes the unlikely race with ptrace_stop(). If the tracee does not schedule() it can miss a freezing condition.I think it would be great if the description is more detailed. This code path always makes my head spin and I think we can definitely use some more guiding in understanding this dang thing. :)
Do you mean describe the race in more details? OK, will do and resend tomorrow.
quoted
@@ -2092,7 +2085,7 @@ static bool do_signal_stop(int signr) } /* Now we don't run again until woken by SIGCONT or SIGKILL */ - schedule(); + freezable_schedule();This makes me wonder whether we still need try_to_freeze() in get_signal_to_deliver() right after the relock: label. Freezer no longer treats STOPPED/TRACED special and both sleeping sites in signal deliver path are marked freezable_schedule(). We shouldn't need the explicit try_to_freeze(), right?
OOPS. I'd say this doesn't really matter but yes we can move it up, get_signal_to_deliver() will be called again. But! the comment above try_to_freeze() becomes misleading with this patch, so this really needs v2. Thanks. Oleg.