lkml.org 
[lkml]   [2011]   [Sep]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/6] cgroup_freezer: fix freezer->state setting bug in freezer_change_state()
    Date
    d02f52811d0e "cgroup_freezer: prepare for removal of TIF_FREEZE" moved
    setting of freezer->state into freezer_change_state(); unfortunately,
    while doing so, when it's beginning to freeze tasks, it sets the state
    to CGROUP_FROZEN instead of CGROUP_FREEZING ending up skipping the
    whole freezing state. Fix it.

    -v2: Oleg pointed out that re-freezing FROZEN cgroup could increment
    system_freezing_cnt. Fixed.

    -v3: Matt pointed out that setting CGROUP_FROZEN always invoked
    try_to_freeze_cgroup() regardless of the current state. Patch
    updated such that the actual freeze/thaw operations are always
    performed on state changes. This shouldn't make any difference
    unless something is broken.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Reported-by: Oleg Nesterov <oleg@redhat.com>
    Cc: Paul Menage <paul@paulmenage.org>
    Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
    Cc: Matt Helsley <matthltc@us.ibm.com>
    ---
    kernel/cgroup_freezer.c | 14 +++++++-------
    1 files changed, 7 insertions(+), 7 deletions(-)
    diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c
    index 4e82525..56a457a 100644
    --- a/kernel/cgroup_freezer.c
    +++ b/kernel/cgroup_freezer.c
    @@ -308,24 +308,24 @@ static int freezer_change_state(struct cgroup *cgroup,
    spin_lock_irq(&freezer->lock);

    update_if_frozen(cgroup, freezer);
    - if (goal_state == freezer->state)
    - goto out;
    -
    - freezer->state = goal_state;

    switch (goal_state) {
    case CGROUP_THAWED:
    - atomic_dec(&system_freezing_cnt);
    + if (freezer->state != CGROUP_THAWED)
    + atomic_dec(&system_freezing_cnt);
    + freezer->state = CGROUP_THAWED;
    unfreeze_cgroup(cgroup, freezer);
    break;
    case CGROUP_FROZEN:
    - atomic_inc(&system_freezing_cnt);
    + if (freezer->state == CGROUP_THAWED)
    + atomic_inc(&system_freezing_cnt);
    + freezer->state = CGROUP_FREEZING;
    retval = try_to_freeze_cgroup(cgroup, freezer);
    break;
    default:
    BUG();
    }
    -out:
    +
    spin_unlock_irq(&freezer->lock);

    return retval;
    --
    1.7.6


    \
     
     \ /
      Last update: 2011-09-02 20:31    [from the cache]
    ©2003-2014 Jasper Spaans. hosted at Digital Ocean