cgroup: implement task_cgroup_path_from_hierarchy()
kdbus folks want a sane way to determine the cgroup path that a given task belongs to on a given hierarchy, which is a reasonble thing to expect from cgroup core. Implement task_cgroup_path_from_hierarchy(). v2: Dropped unnecessary NULL check on the return value of task_cgroup_from_root() as suggested by Li Zefan. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Greg Kroah-Hartman <greg@kroah.com> Acked-by: Li Zefan <lizefan@huawei.com> Cc: Kay Sievers <kay@vrfy.org> Cc: Lennart Poettering <lennart@poettering.net> Cc: Daniel Mack <daniel@zonque.org>
This commit is contained in:
parent
1a57423166
commit
857a2beb09
2 changed files with 34 additions and 0 deletions
|
@ -542,6 +542,8 @@ int cgroup_is_removed(const struct cgroup *cgrp);
|
||||||
bool cgroup_is_descendant(struct cgroup *cgrp, struct cgroup *ancestor);
|
bool cgroup_is_descendant(struct cgroup *cgrp, struct cgroup *ancestor);
|
||||||
|
|
||||||
int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen);
|
int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen);
|
||||||
|
int task_cgroup_path_from_hierarchy(struct task_struct *task, int hierarchy_id,
|
||||||
|
char *buf, size_t buflen);
|
||||||
|
|
||||||
int cgroup_task_count(const struct cgroup *cgrp);
|
int cgroup_task_count(const struct cgroup *cgrp);
|
||||||
|
|
||||||
|
|
|
@ -1827,6 +1827,38 @@ out:
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(cgroup_path);
|
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
|
* Control Group taskset
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Reference in a new issue