Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 115883
b: refs/heads/master
c: 957a4ee
h: refs/heads/master
i:
  115881: daee211
  115879: c488565
v: v3
  • Loading branch information
Matt Helsley authored and Linus Torvalds committed Oct 20, 2008
1 parent d57a951 commit 4afbb58
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 18 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: 5a06915c6df9b89cda5ddb3f8cce5f9a6be534d2
refs/heads/master: 957a4eeaf4af614ab0fc4c09a22593d6ab233f5b
43 changes: 26 additions & 17 deletions trunk/kernel/cgroup_freezer.c
Original file line number Diff line number Diff line change
Expand Up @@ -145,22 +145,40 @@ static void freezer_destroy(struct cgroup_subsys *ss,
kfree(cgroup_freezer(cgroup));
}

/* Task is frozen or will freeze immediately when next it gets woken */
static bool is_task_frozen_enough(struct task_struct *task)
{
return frozen(task) ||
(task_is_stopped_or_traced(task) && freezing(task));
}

/*
* The call to cgroup_lock() in the freezer.state write method prevents
* a write to that file racing against an attach, and hence the
* can_attach() result will remain valid until the attach completes.
*/
static int freezer_can_attach(struct cgroup_subsys *ss,
struct cgroup *new_cgroup,
struct task_struct *task)
{
struct freezer *freezer;
int retval = 0;
int retval;

/* Anything frozen can't move or be moved to/from */

if (is_task_frozen_enough(task))
return -EBUSY;

/*
* The call to cgroup_lock() in the freezer.state write method prevents
* a write to that file racing against an attach, and hence the
* can_attach() result will remain valid until the attach completes.
*/
freezer = cgroup_freezer(new_cgroup);
if (freezer->state == STATE_FROZEN)
return -EBUSY;

retval = 0;
task_lock(task);
freezer = task_freezer(task);
if (freezer->state == STATE_FROZEN)
retval = -EBUSY;
task_unlock(task);
return retval;
}

Expand Down Expand Up @@ -193,12 +211,7 @@ static void check_if_frozen(struct cgroup *cgroup,
cgroup_iter_start(cgroup, &it);
while ((task = cgroup_iter_next(cgroup, &it))) {
ntotal++;
/*
* Task is frozen or will freeze immediately when next it gets
* woken
*/
if (frozen(task) ||
(task_is_stopped_or_traced(task) && freezing(task)))
if (is_task_frozen_enough(task))
nfrozen++;
}

Expand Down Expand Up @@ -249,11 +262,7 @@ static int try_to_freeze_cgroup(struct cgroup *cgroup, struct freezer *freezer)
while ((task = cgroup_iter_next(cgroup, &it))) {
if (!freeze_task(task, true))
continue;
if (task_is_stopped_or_traced(task) && freezing(task))
/*
* The freeze flag is set so these tasks will
* immediately go into the fridge upon waking.
*/
if (is_task_frozen_enough(task))
continue;
if (!freezing(task) && !freezer_should_skip(task))
num_cant_freeze_now++;
Expand Down

0 comments on commit 4afbb58

Please sign in to comment.