|
@@ -329,6 +329,24 @@ static inline struct cftype *__d_cft(struct dentry *dentry)
|
|
|
return __d_cfe(dentry)->type;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * cgroup_lock_live_group - take cgroup_mutex and check that cgrp is alive.
|
|
|
+ * @cgrp: the cgroup to be checked for liveness
|
|
|
+ *
|
|
|
+ * On success, returns true; the lock should be later released with
|
|
|
+ * cgroup_unlock(). On failure returns false with no lock held.
|
|
|
+ */
|
|
|
+bool cgroup_lock_live_group(struct cgroup *cgrp)
|
|
|
+{
|
|
|
+ mutex_lock(&cgroup_mutex);
|
|
|
+ if (cgroup_is_removed(cgrp)) {
|
|
|
+ mutex_unlock(&cgroup_mutex);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(cgroup_lock_live_group);
|
|
|
+
|
|
|
/* the list of cgroups eligible for automatic release. Protected by
|
|
|
* release_list_lock */
|
|
|
static LIST_HEAD(release_list);
|
|
@@ -1943,30 +1961,6 @@ static void cgroup_task_migrate(struct cgroup *oldcgrp,
|
|
|
put_css_set(oldcg);
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * cgroup_attach_task_all - attach task 'tsk' to all cgroups of task 'from'
|
|
|
- * @from: attach to all cgroups of a given task
|
|
|
- * @tsk: the task to be attached
|
|
|
- */
|
|
|
-int cgroup_attach_task_all(struct task_struct *from, struct task_struct *tsk)
|
|
|
-{
|
|
|
- struct cgroupfs_root *root;
|
|
|
- int retval = 0;
|
|
|
-
|
|
|
- cgroup_lock();
|
|
|
- for_each_active_root(root) {
|
|
|
- struct cgroup *from_cg = task_cgroup_from_root(from, root);
|
|
|
-
|
|
|
- retval = cgroup_attach_task(from_cg, tsk, false);
|
|
|
- if (retval)
|
|
|
- break;
|
|
|
- }
|
|
|
- cgroup_unlock();
|
|
|
-
|
|
|
- return retval;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(cgroup_attach_task_all);
|
|
|
-
|
|
|
/**
|
|
|
* cgroup_attach_task - attach a task or a whole threadgroup to a cgroup
|
|
|
* @cgrp: the cgroup to attach to
|
|
@@ -2204,6 +2198,30 @@ out_unlock_cgroup:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * cgroup_attach_task_all - attach task 'tsk' to all cgroups of task 'from'
|
|
|
+ * @from: attach to all cgroups of a given task
|
|
|
+ * @tsk: the task to be attached
|
|
|
+ */
|
|
|
+int cgroup_attach_task_all(struct task_struct *from, struct task_struct *tsk)
|
|
|
+{
|
|
|
+ struct cgroupfs_root *root;
|
|
|
+ int retval = 0;
|
|
|
+
|
|
|
+ cgroup_lock();
|
|
|
+ for_each_active_root(root) {
|
|
|
+ struct cgroup *from_cg = task_cgroup_from_root(from, root);
|
|
|
+
|
|
|
+ retval = cgroup_attach_task(from_cg, tsk, false);
|
|
|
+ if (retval)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ cgroup_unlock();
|
|
|
+
|
|
|
+ return retval;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(cgroup_attach_task_all);
|
|
|
+
|
|
|
static int cgroup_tasks_write(struct cgroup *cgrp, struct cftype *cft, u64 pid)
|
|
|
{
|
|
|
return attach_task_by_pid(cgrp, pid, false);
|
|
@@ -2214,24 +2232,6 @@ static int cgroup_procs_write(struct cgroup *cgrp, struct cftype *cft, u64 tgid)
|
|
|
return attach_task_by_pid(cgrp, tgid, true);
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * cgroup_lock_live_group - take cgroup_mutex and check that cgrp is alive.
|
|
|
- * @cgrp: the cgroup to be checked for liveness
|
|
|
- *
|
|
|
- * On success, returns true; the lock should be later released with
|
|
|
- * cgroup_unlock(). On failure returns false with no lock held.
|
|
|
- */
|
|
|
-bool cgroup_lock_live_group(struct cgroup *cgrp)
|
|
|
-{
|
|
|
- mutex_lock(&cgroup_mutex);
|
|
|
- if (cgroup_is_removed(cgrp)) {
|
|
|
- mutex_unlock(&cgroup_mutex);
|
|
|
- return false;
|
|
|
- }
|
|
|
- return true;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(cgroup_lock_live_group);
|
|
|
-
|
|
|
static int cgroup_release_agent_write(struct cgroup *cgrp, struct cftype *cft,
|
|
|
const char *buffer)
|
|
|
{
|