cgroup_freezer: prepare freezer_change_state() for full hierarchy support

* 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 <tj@kernel.org>
Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Reviewed-by: Michal Hocko <mhocko@suse.cz>
This commit is contained in:
Tejun Heo 2012-11-09 09:12:30 -08:00
parent bcd66c894a
commit 04a4ec3257

View File

@ -247,45 +247,57 @@ static void unfreeze_cgroup(struct freezer *freezer)
cgroup_iter_end(cgroup, &it); 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() */ /* also synchronizes against task migration, see freezer_attach() */
spin_lock_irq(&freezer->lock); lockdep_assert_held(&freezer->lock);
switch (goal_state) { if (freeze) {
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 (freezer->state == CGROUP_THAWED) if (freezer->state == CGROUP_THAWED)
atomic_inc(&system_freezing_cnt); atomic_inc(&system_freezing_cnt);
freezer->state = CGROUP_FREEZING; freezer->state = CGROUP_FREEZING;
freeze_cgroup(freezer); freeze_cgroup(freezer);
break; } else {
default: if (freezer->state != CGROUP_THAWED)
BUG(); 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); spin_unlock_irq(&freezer->lock);
} }
static int freezer_write(struct cgroup *cgroup, struct cftype *cft, static int freezer_write(struct cgroup *cgroup, struct cftype *cft,
const char *buffer) const char *buffer)
{ {
enum freezer_state goal_state; bool freeze;
if (strcmp(buffer, freezer_state_strs[CGROUP_THAWED]) == 0) 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) else if (strcmp(buffer, freezer_state_strs[CGROUP_FROZEN]) == 0)
goal_state = CGROUP_FROZEN; freeze = true;
else else
return -EINVAL; return -EINVAL;
freezer_change_state(cgroup_freezer(cgroup), goal_state); freezer_change_state(cgroup_freezer(cgroup), freeze);
return 0; return 0;
} }