|
@@ -48,19 +48,17 @@ static inline struct freezer *task_freezer(struct task_struct *task)
|
|
struct freezer, css);
|
|
struct freezer, css);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline int __cgroup_freezing_or_frozen(struct task_struct *task)
|
|
|
|
|
|
+bool cgroup_freezing(struct task_struct *task)
|
|
{
|
|
{
|
|
- enum freezer_state state = task_freezer(task)->state;
|
|
|
|
- return (state == CGROUP_FREEZING) || (state == CGROUP_FROZEN);
|
|
|
|
-}
|
|
|
|
|
|
+ enum freezer_state state;
|
|
|
|
+ bool ret;
|
|
|
|
|
|
-int cgroup_freezing_or_frozen(struct task_struct *task)
|
|
|
|
-{
|
|
|
|
- int result;
|
|
|
|
- task_lock(task);
|
|
|
|
- result = __cgroup_freezing_or_frozen(task);
|
|
|
|
- task_unlock(task);
|
|
|
|
- return result;
|
|
|
|
|
|
+ rcu_read_lock();
|
|
|
|
+ state = task_freezer(task)->state;
|
|
|
|
+ ret = state == CGROUP_FREEZING || state == CGROUP_FROZEN;
|
|
|
|
+ rcu_read_unlock();
|
|
|
|
+
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -102,9 +100,6 @@ struct cgroup_subsys freezer_subsys;
|
|
* freezer_can_attach():
|
|
* freezer_can_attach():
|
|
* cgroup_mutex (held by caller of can_attach)
|
|
* cgroup_mutex (held by caller of can_attach)
|
|
*
|
|
*
|
|
- * cgroup_freezing_or_frozen():
|
|
|
|
- * task->alloc_lock (to get task's cgroup)
|
|
|
|
- *
|
|
|
|
* freezer_fork() (preserving fork() performance means can't take cgroup_mutex):
|
|
* freezer_fork() (preserving fork() performance means can't take cgroup_mutex):
|
|
* freezer->lock
|
|
* freezer->lock
|
|
* sighand->siglock (if the cgroup is freezing)
|
|
* sighand->siglock (if the cgroup is freezing)
|
|
@@ -177,13 +172,7 @@ static int freezer_can_attach(struct cgroup_subsys *ss,
|
|
|
|
|
|
static int freezer_can_attach_task(struct cgroup *cgrp, struct task_struct *tsk)
|
|
static int freezer_can_attach_task(struct cgroup *cgrp, struct task_struct *tsk)
|
|
{
|
|
{
|
|
- rcu_read_lock();
|
|
|
|
- if (__cgroup_freezing_or_frozen(tsk)) {
|
|
|
|
- rcu_read_unlock();
|
|
|
|
- return -EBUSY;
|
|
|
|
- }
|
|
|
|
- rcu_read_unlock();
|
|
|
|
- return 0;
|
|
|
|
|
|
+ return cgroup_freezing(tsk) ? -EBUSY : 0;
|
|
}
|
|
}
|
|
|
|
|
|
static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task)
|
|
static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task)
|
|
@@ -279,7 +268,6 @@ static int try_to_freeze_cgroup(struct cgroup *cgroup, struct freezer *freezer)
|
|
struct task_struct *task;
|
|
struct task_struct *task;
|
|
unsigned int num_cant_freeze_now = 0;
|
|
unsigned int num_cant_freeze_now = 0;
|
|
|
|
|
|
- freezer->state = CGROUP_FREEZING;
|
|
|
|
cgroup_iter_start(cgroup, &it);
|
|
cgroup_iter_start(cgroup, &it);
|
|
while ((task = cgroup_iter_next(cgroup, &it))) {
|
|
while ((task = cgroup_iter_next(cgroup, &it))) {
|
|
if (!freeze_task(task, true))
|
|
if (!freeze_task(task, true))
|
|
@@ -303,8 +291,6 @@ static void unfreeze_cgroup(struct cgroup *cgroup, struct freezer *freezer)
|
|
while ((task = cgroup_iter_next(cgroup, &it)))
|
|
while ((task = cgroup_iter_next(cgroup, &it)))
|
|
__thaw_task(task);
|
|
__thaw_task(task);
|
|
cgroup_iter_end(cgroup, &it);
|
|
cgroup_iter_end(cgroup, &it);
|
|
-
|
|
|
|
- freezer->state = CGROUP_THAWED;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static int freezer_change_state(struct cgroup *cgroup,
|
|
static int freezer_change_state(struct cgroup *cgroup,
|
|
@@ -318,20 +304,20 @@ static int freezer_change_state(struct cgroup *cgroup,
|
|
spin_lock_irq(&freezer->lock);
|
|
spin_lock_irq(&freezer->lock);
|
|
|
|
|
|
update_if_frozen(cgroup, freezer);
|
|
update_if_frozen(cgroup, freezer);
|
|
- if (goal_state == freezer->state)
|
|
|
|
- goto out;
|
|
|
|
|
|
|
|
switch (goal_state) {
|
|
switch (goal_state) {
|
|
case CGROUP_THAWED:
|
|
case CGROUP_THAWED:
|
|
|
|
+ freezer->state = CGROUP_THAWED;
|
|
unfreeze_cgroup(cgroup, freezer);
|
|
unfreeze_cgroup(cgroup, freezer);
|
|
break;
|
|
break;
|
|
case CGROUP_FROZEN:
|
|
case CGROUP_FROZEN:
|
|
|
|
+ freezer->state = CGROUP_FREEZING;
|
|
retval = try_to_freeze_cgroup(cgroup, freezer);
|
|
retval = try_to_freeze_cgroup(cgroup, freezer);
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
BUG();
|
|
BUG();
|
|
}
|
|
}
|
|
-out:
|
|
|
|
|
|
+
|
|
spin_unlock_irq(&freezer->lock);
|
|
spin_unlock_irq(&freezer->lock);
|
|
|
|
|
|
return retval;
|
|
return retval;
|