projects
/
linux-block.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
memory controller: soft limit organize cgroups
[linux-block.git]
/
kernel
/
cgroup_freezer.c
diff --git
a/kernel/cgroup_freezer.c
b/kernel/cgroup_freezer.c
index 6605907104091f303cdb3bdb623bc77de03ee8bb..59e9ef6aab4002e1d99170f50156e733e8f46343 100644
(file)
--- a/
kernel/cgroup_freezer.c
+++ b/
kernel/cgroup_freezer.c
@@
-159,7
+159,7
@@
static bool is_task_frozen_enough(struct task_struct *task)
*/
static int freezer_can_attach(struct cgroup_subsys *ss,
struct cgroup *new_cgroup,
*/
static int freezer_can_attach(struct cgroup_subsys *ss,
struct cgroup *new_cgroup,
- struct task_struct *task)
+ struct task_struct *task
, bool threadgroup
)
{
struct freezer *freezer;
{
struct freezer *freezer;
@@
-177,6
+177,19
@@
static int freezer_can_attach(struct cgroup_subsys *ss,
if (freezer->state == CGROUP_FROZEN)
return -EBUSY;
if (freezer->state == CGROUP_FROZEN)
return -EBUSY;
+ if (threadgroup) {
+ struct task_struct *c;
+
+ rcu_read_lock();
+ list_for_each_entry_rcu(c, &task->thread_group, thread_group) {
+ if (is_task_frozen_enough(c)) {
+ rcu_read_unlock();
+ return -EBUSY;
+ }
+ }
+ rcu_read_unlock();
+ }
+
return 0;
}
return 0;
}
@@
-192,6
+205,13
@@
static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task)
*/
freezer = task_freezer(task);
*/
freezer = task_freezer(task);
+ /*
+ * The root cgroup is non-freezable, so we can skip the
+ * following check.
+ */
+ if (!freezer->css.cgroup->parent)
+ return;
+
spin_lock_irq(&freezer->lock);
BUG_ON(freezer->state == CGROUP_FROZEN);
spin_lock_irq(&freezer->lock);
BUG_ON(freezer->state == CGROUP_FROZEN);
@@
-335,7
+355,7
@@
static int freezer_write(struct cgroup *cgroup,
else if (strcmp(buffer, freezer_state_strs[CGROUP_FROZEN]) == 0)
goal_state = CGROUP_FROZEN;
else
else if (strcmp(buffer, freezer_state_strs[CGROUP_FROZEN]) == 0)
goal_state = CGROUP_FROZEN;
else
- return -EI
O
;
+ return -EI
NVAL
;
if (!cgroup_lock_live_group(cgroup))
return -ENODEV;
if (!cgroup_lock_live_group(cgroup))
return -ENODEV;
@@
-354,6
+374,8
@@
static struct cftype files[] = {
static int freezer_populate(struct cgroup_subsys *ss, struct cgroup *cgroup)
{
static int freezer_populate(struct cgroup_subsys *ss, struct cgroup *cgroup)
{
+ if (!cgroup->parent)
+ return 0;
return cgroup_add_files(cgroup, ss, files, ARRAY_SIZE(files));
}
return cgroup_add_files(cgroup, ss, files, ARRAY_SIZE(files));
}