lkml.org 
[lkml]   [2012]   [Oct]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4/7] cgroup_freezer: don't stall transition to FROZEN for PF_NOFREEZE or PF_FREEZER_SKIP tasks
    Date
    cgroup_freezer doesn't transition from FREEZING to FROZEN if the
    cgroup contains PF_NOFREEZE tasks or tasks sleeping with
    PF_FREEZER_SKIP set.

    Only kernel tasks can be non-freezable (PF_NOFREEZE) and there's
    nothing cgroup_freezer or userland can do about or to it. It's
    pointless to stall the transition for PF_NOFREEZE tasks.

    PF_FREEZER_SKIP indicates that the task can be skipped when
    determining whether frozen state is reached. A task with
    PF_FREEZER_SKIP is guaranteed to perform try_to_freeze() after it
    wakes up and can be considered frozen much like stopped or traced
    tasks. Note that a vfork parent uses PF_FREEZER_SKIP while waiting
    for the child.

    This updates update_if_frozen() such that it only considers freezable
    tasks and treats %true freezer_should_skip() tasks as frozen.

    This allows cgroups w/ kthreads and vfork parents successfully reach
    FROZEN state.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Rafael J. Wysocki <rjw@sisk.pl>
    ---
    kernel/cgroup_freezer.c | 16 ++++++++++++----
    1 files changed, 12 insertions(+), 4 deletions(-)

    diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c
    index 05d5218..557f367 100644
    --- a/kernel/cgroup_freezer.c
    +++ b/kernel/cgroup_freezer.c
    @@ -214,10 +214,18 @@ static void update_if_frozen(struct cgroup *cgroup,

    cgroup_iter_start(cgroup, &it);
    while ((task = cgroup_iter_next(cgroup, &it))) {
    - ntotal++;
    - if (freezing(task) && (frozen(task) ||
    - task_is_stopped_or_traced(task)))
    - nfrozen++;
    + if (freezing(task)) {
    + ntotal++;
    + /*
    + * freezer_should_skip() indicates that the task
    + * should be skipped when determining freezing
    + * completion. Consider it frozen in addition to
    + * the usual frozen condition.
    + */
    + if (frozen(task) || task_is_stopped_or_traced(task) ||
    + freezer_should_skip(task))
    + nfrozen++;
    + }
    }

    if (old_state == CGROUP_THAWED) {
    --
    1.7.7.3


    \
     
     \ /
      Last update: 2012-10-17 00:41    [W:5.086 / U:0.280 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site