mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 14:42:24 +00:00
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:
parent
bcd66c894a
commit
04a4ec3257
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user