Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 339304
b: refs/heads/master
c: b4d1831
h: refs/heads/master
v: v3
  • Loading branch information
Tejun Heo committed Oct 20, 2012
1 parent defd0d4 commit fdccb87
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 27 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8755ade683241e8c6b8fe8d22d0ae35041a3dc51
refs/heads/master: b4d18311d37b0b1b370a1ef3e4de92b97930f0a8
43 changes: 17 additions & 26 deletions trunk/kernel/cgroup_freezer.c
Original file line number Diff line number Diff line change
Expand Up @@ -213,41 +213,39 @@ static void freezer_fork(struct task_struct *task)
}

/*
* caller must hold freezer->lock
* We change from FREEZING to FROZEN lazily if the cgroup was only
* partially frozen when we exitted write. Caller must hold freezer->lock.
*
* Task states and freezer state might disagree while tasks are being
* migrated into @cgroup, so we can't verify task states against @freezer
* state here. See freezer_attach() for details.
*/
static void update_if_frozen(struct cgroup *cgroup,
struct freezer *freezer)
static void update_if_frozen(struct cgroup *cgroup, struct freezer *freezer)
{
struct cgroup_iter it;
struct task_struct *task;
unsigned int nfrozen = 0, ntotal = 0;
enum freezer_state old_state = freezer->state;

if (freezer->state != CGROUP_FREEZING)
return;

cgroup_iter_start(cgroup, &it);

while ((task = cgroup_iter_next(cgroup, &it))) {
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 (!frozen(task) && !task_is_stopped_or_traced(task) &&
!freezer_should_skip(task))
goto notyet;
}
}

if (old_state == CGROUP_THAWED) {
BUG_ON(nfrozen > 0);
} else if (old_state == CGROUP_FREEZING) {
if (nfrozen == ntotal)
freezer->state = CGROUP_FROZEN;
} else { /* old_state == CGROUP_FROZEN */
BUG_ON(nfrozen != ntotal);
}

freezer->state = CGROUP_FROZEN;
notyet:
cgroup_iter_end(cgroup, &it);
}

Expand All @@ -262,13 +260,8 @@ static int freezer_read(struct cgroup *cgroup, struct cftype *cft,

freezer = cgroup_freezer(cgroup);
spin_lock_irq(&freezer->lock);
update_if_frozen(cgroup, freezer);
state = freezer->state;
if (state == CGROUP_FREEZING) {
/* We change from FREEZING to FROZEN lazily if the cgroup was
* only partially frozen when we exitted write. */
update_if_frozen(cgroup, freezer);
state = freezer->state;
}
spin_unlock_irq(&freezer->lock);
cgroup_unlock();

Expand Down Expand Up @@ -306,8 +299,6 @@ static void freezer_change_state(struct cgroup *cgroup,

spin_lock_irq(&freezer->lock);

update_if_frozen(cgroup, freezer);

switch (goal_state) {
case CGROUP_THAWED:
if (freezer->state != CGROUP_THAWED)
Expand Down

0 comments on commit fdccb87

Please sign in to comment.