|
@@ -1827,6 +1827,38 @@ out:
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(cgroup_path);
|
|
|
|
|
|
+/**
|
|
|
+ * task_cgroup_path_from_hierarchy - cgroup path of a task on a hierarchy
|
|
|
+ * @task: target task
|
|
|
+ * @hierarchy_id: the hierarchy to look up @task's cgroup from
|
|
|
+ * @buf: the buffer to write the path into
|
|
|
+ * @buflen: the length of the buffer
|
|
|
+ *
|
|
|
+ * Determine @task's cgroup on the hierarchy specified by @hierarchy_id and
|
|
|
+ * copy its path into @buf. This function grabs cgroup_mutex and shouldn't
|
|
|
+ * be used inside locks used by cgroup controller callbacks.
|
|
|
+ */
|
|
|
+int task_cgroup_path_from_hierarchy(struct task_struct *task, int hierarchy_id,
|
|
|
+ char *buf, size_t buflen)
|
|
|
+{
|
|
|
+ struct cgroupfs_root *root;
|
|
|
+ struct cgroup *cgrp = NULL;
|
|
|
+ int ret = -ENOENT;
|
|
|
+
|
|
|
+ mutex_lock(&cgroup_mutex);
|
|
|
+
|
|
|
+ root = idr_find(&cgroup_hierarchy_idr, hierarchy_id);
|
|
|
+ if (root) {
|
|
|
+ cgrp = task_cgroup_from_root(task, root);
|
|
|
+ ret = cgroup_path(cgrp, buf, buflen);
|
|
|
+ }
|
|
|
+
|
|
|
+ mutex_unlock(&cgroup_mutex);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(task_cgroup_path_from_hierarchy);
|
|
|
+
|
|
|
/*
|
|
|
* Control Group taskset
|
|
|
*/
|