• Roman Gushchin's avatar
    cgroup: prevent spurious transition into non-frozen state · cb2c4cd8
    Roman Gushchin authored
    If freezing of a cgroup races with waking of a task from
    the frozen state (like waiting in vfork() or in do_signal_stop()),
    a spurious transition of the cgroup state can happen.
    
    The task enters cgroup_leave_frozen(true), the cgroup->nr_frozen_tasks
    counter decrements, and the cgroup is switched to the unfrozen state.
    
    To prevent it, let's reserve cgroup_leave_frozen(true) for
    terminating processes and use cgroup_leave_frozen(false) otherwise.
    
    To avoid busy-looping in the signal handling loop waiting
    for JOBCTL_TRAP_FREEZE set from the cgroup freezing path,
    let's do it explicitly in cgroup_leave_frozen(), if the task
    is going to stay frozen.
    Suggested-by: default avatarOleg Nesterov <oleg@redhat.com>
    Signed-off-by: default avatarRoman Gushchin <guro@fb.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    cb2c4cd8
freezer.c 7.77 KB