Skip to content

Commit

Permalink
cgroup_freezer: prepare freezer_change_state() for full hierarchy sup…
Browse files Browse the repository at this point in the history
…port

* Make freezer_change_state() take bool @Freeze instead of enum
  freezer_state.

* Separate out freezer_apply_state() out of freezer_change_state().
  This makes freezer_change_state() a rather silly thin wrapper.  It
  will be filled with hierarchy handling later on.

This patch doesn't introduce any behavior change.

Signed-off-by: Tejun Heo <[email protected]>
Reviewed-by: KAMEZAWA Hiroyuki <[email protected]>
Reviewed-by: Michal Hocko <[email protected]>
  • Loading branch information
htejun committed Nov 9, 2012
1 parent bcd66c8 commit 04a4ec3
Showing 1 changed file with 30 additions and 18 deletions.
48 changes: 30 additions & 18 deletions kernel/cgroup_freezer.c
Original file line number Diff line number Diff line change
Expand Up @@ -247,45 +247,57 @@ static void unfreeze_cgroup(struct freezer *freezer)
cgroup_iter_end(cgroup, &it);
}

static void freezer_change_state(struct freezer *freezer,
enum freezer_state goal_state)
/**
* freezer_apply_state - apply state change to a single cgroup_freezer
* @freezer: freezer to apply state change to
* @freeze: whether to freeze or unfreeze
*/
static void freezer_apply_state(struct freezer *freezer, bool freeze)
{
/* also synchronizes against task migration, see freezer_attach() */
spin_lock_irq(&freezer->lock);
lockdep_assert_held(&freezer->lock);

switch (goal_state) {
case CGROUP_THAWED:
if (freezer->state != CGROUP_THAWED)
atomic_dec(&system_freezing_cnt);
freezer->state = CGROUP_THAWED;
unfreeze_cgroup(freezer);
break;
case CGROUP_FROZEN:
if (freeze) {
if (freezer->state == CGROUP_THAWED)
atomic_inc(&system_freezing_cnt);
freezer->state = CGROUP_FREEZING;
freeze_cgroup(freezer);
break;
default:
BUG();
} else {
if (freezer->state != CGROUP_THAWED)
atomic_dec(&system_freezing_cnt);
freezer->state = CGROUP_THAWED;
unfreeze_cgroup(freezer);
}
}

/**
* freezer_change_state - change the freezing state of a cgroup_freezer
* @freezer: freezer of interest
* @freeze: whether to freeze or thaw
*
* Freeze or thaw @cgroup according to @freeze.
*/
static void freezer_change_state(struct freezer *freezer, bool freeze)
{
/* update @freezer */
spin_lock_irq(&freezer->lock);
freezer_apply_state(freezer, freeze);
spin_unlock_irq(&freezer->lock);
}

static int freezer_write(struct cgroup *cgroup, struct cftype *cft,
const char *buffer)
{
enum freezer_state goal_state;
bool freeze;

if (strcmp(buffer, freezer_state_strs[CGROUP_THAWED]) == 0)
goal_state = CGROUP_THAWED;
freeze = false;
else if (strcmp(buffer, freezer_state_strs[CGROUP_FROZEN]) == 0)
goal_state = CGROUP_FROZEN;
freeze = true;
else
return -EINVAL;

freezer_change_state(cgroup_freezer(cgroup), goal_state);
freezer_change_state(cgroup_freezer(cgroup), freeze);
return 0;
}

Expand Down

0 comments on commit 04a4ec3

Please sign in to comment.