[PATCH v2 1/1] freezer: change ptrace_stop/do_signal_stop to use freezable_schedule()
oleg at redhat.com
Sun Oct 28 13:45:33 UTC 2012
On 10/27, Ben Hutchings wrote:
> On Fri, 2012-10-26 at 19:46 +0200, Oleg Nesterov wrote:
> > try_to_freeze_tasks() and cgroup_freezer rely on scheduler locks
> > to ensure that a task doing STOPPED/TRACED -> RUNNING transition
> > can't escape freezing. This mostly works, but ptrace_stop() does
> > not necessarily call schedule(), it can change task->state back to
> > RUNNING and check freezing() without any lock/barrier in between.
> > We could add the necessary barrier, but this patch changes
> > ptrace_stop() and do_signal_stop() to use freezable_schedule().
> > This fixes the race, freezer_count() and freezer_should_skip()
> > carefully avoid the race.
> > And this simplifies the code, try_to_freeze_tasks/update_if_frozen
> > no longer need to use task_is_stopped_or_traced() checks with the
> > non trivial assumptions. We can rely on the mechanism which was
> > specially designed to mark the sleeping task as "frozen enough".
> > v2: As Tejun pointed out, we can also change get_signal_to_deliver()
> > and move try_to_freeze() up before 'relock' label.
> > Signed-off-by: Oleg Nesterov <oleg at redhat.com>
> This is not the correct way to submit a change to stable. Please see
Sorry for confusion, it is not for stable@, it was cc'ed by mistake.
More information about the Containers