aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2013-07-11 19:34:48 -0400
committerTejun Heo <tj@kernel.org>2013-07-12 15:49:05 -0400
commit913ffdb54366f94eec65c656cae8c6e00e1ab1b0 (patch)
tree55dae8f32f7a0a64ed6b665497e12414fb6d3103
parentadd0c59d802e6118e51e21244c3871be35164e4b (diff)
cgroup: replace task_cgroup_path_from_hierarchy() with task_cgroup_path()
task_cgroup_path_from_hierarchy() was added for the planned new users and none of the currently planned users wants to know about multiple hierarchies. This patch drops the multiple hierarchy part and makes it always return the path in the first non-dummy hierarchy. As unified hierarchy will always have id 1, this is guaranteed to return the path for the unified hierarchy if mounted; otherwise, it will return the path from the hierarchy which happens to occupy the lowest hierarchy id, which will usually be the first hierarchy mounted after boot. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Li Zefan <lizefan@huawei.com> Cc: Lennart Poettering <lennart@poettering.net> Cc: Kay Sievers <kay.sievers@vrfy.org> Cc: Jan Kaluža <jkaluza@redhat.com>
-rw-r--r--include/linux/cgroup.h3
-rw-r--r--kernel/cgroup.c31
2 files changed, 20 insertions, 14 deletions
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index fd097ecfcd97..21cfaff7e002 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -540,8 +540,7 @@ int cgroup_rm_cftypes(struct cgroup_subsys *ss, struct cftype *cfts);
540bool cgroup_is_descendant(struct cgroup *cgrp, struct cgroup *ancestor); 540bool cgroup_is_descendant(struct cgroup *cgrp, struct cgroup *ancestor);
541 541
542int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen); 542int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen);
543int task_cgroup_path_from_hierarchy(struct task_struct *task, int hierarchy_id, 543int task_cgroup_path(struct task_struct *task, char *buf, size_t buflen);
544 char *buf, size_t buflen);
545 544
546int cgroup_task_count(const struct cgroup *cgrp); 545int cgroup_task_count(const struct cgroup *cgrp);
547 546
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index e5583d10a325..afb8d53ca6c7 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -1846,36 +1846,43 @@ out:
1846EXPORT_SYMBOL_GPL(cgroup_path); 1846EXPORT_SYMBOL_GPL(cgroup_path);
1847 1847
1848/** 1848/**
1849 * task_cgroup_path_from_hierarchy - cgroup path of a task on a hierarchy 1849 * task_cgroup_path - cgroup path of a task in the first cgroup hierarchy
1850 * @task: target task 1850 * @task: target task
1851 * @hierarchy_id: the hierarchy to look up @task's cgroup from
1852 * @buf: the buffer to write the path into 1851 * @buf: the buffer to write the path into
1853 * @buflen: the length of the buffer 1852 * @buflen: the length of the buffer
1854 * 1853 *
1855 * Determine @task's cgroup on the hierarchy specified by @hierarchy_id and 1854 * Determine @task's cgroup on the first (the one with the lowest non-zero
1856 * copy its path into @buf. This function grabs cgroup_mutex and shouldn't 1855 * hierarchy_id) cgroup hierarchy and copy its path into @buf. This
1857 * be used inside locks used by cgroup controller callbacks. 1856 * function grabs cgroup_mutex and shouldn't be used inside locks used by
1857 * cgroup controller callbacks.
1858 *
1859 * Returns 0 on success, fails with -%ENAMETOOLONG if @buflen is too short.
1858 */ 1860 */
1859int task_cgroup_path_from_hierarchy(struct task_struct *task, int hierarchy_id, 1861int task_cgroup_path(struct task_struct *task, char *buf, size_t buflen)
1860 char *buf, size_t buflen)
1861{ 1862{
1862 struct cgroupfs_root *root; 1863 struct cgroupfs_root *root;
1863 struct cgroup *cgrp = NULL; 1864 struct cgroup *cgrp;
1864 int ret = -ENOENT; 1865 int hierarchy_id = 1, ret = 0;
1866
1867 if (buflen < 2)
1868 return -ENAMETOOLONG;
1865 1869
1866 mutex_lock(&cgroup_mutex); 1870 mutex_lock(&cgroup_mutex);
1867 1871
1868 root = idr_find(&cgroup_hierarchy_idr, hierarchy_id); 1872 root = idr_get_next(&cgroup_hierarchy_idr, &hierarchy_id);
1873
1869 if (root) { 1874 if (root) {
1870 cgrp = task_cgroup_from_root(task, root); 1875 cgrp = task_cgroup_from_root(task, root);
1871 ret = cgroup_path(cgrp, buf, buflen); 1876 ret = cgroup_path(cgrp, buf, buflen);
1877 } else {
1878 /* if no hierarchy exists, everyone is in "/" */
1879 memcpy(buf, "/", 2);
1872 } 1880 }
1873 1881
1874 mutex_unlock(&cgroup_mutex); 1882 mutex_unlock(&cgroup_mutex);
1875
1876 return ret; 1883 return ret;
1877} 1884}
1878EXPORT_SYMBOL_GPL(task_cgroup_path_from_hierarchy); 1885EXPORT_SYMBOL_GPL(task_cgroup_path);
1879 1886
1880/* 1887/*
1881 * Control Group taskset 1888 * Control Group taskset