aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWaiman Long <longman@redhat.com>2018-11-08 10:08:46 -0500
committerTejun Heo <tj@kernel.org>2018-11-08 15:27:32 -0500
commit5cf8114d6e90b3822be5eb6a2faedf99d1c08f77 (patch)
tree16b09eef25c0af64f99e434122240bd5e652fde3
parent90e92f2d557ee3b0883a3bee76150b9026dba192 (diff)
cpuset: Expose cpuset.cpus.subpartitions with cgroup_debug
For debugging purpose, it will be useful to expose the content of the subparts_cpus as a read-only file to see if the code work correctly. However, subparts_cpus will not be used at all in most use cases. So adding a new cpuset file that clutters the cgroup directory may not be desirable. This is now being done by using the hidden "cgroup_debug" kernel command line option to expose a new "cpuset.cpus.subpartitions" file. That option was originally used by the debug controller to expose itself when configured into the kernel. This is now extended to set an internal flag used by cgroup_addrm_files(). A new CFTYPE_DEBUG flag can now be used to specify that a cgroup file should only be created when the "cgroup_debug" option is specified. Signed-off-by: Waiman Long <longman@redhat.com> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Tejun Heo <tj@kernel.org>
-rw-r--r--include/linux/cgroup-defs.h1
-rw-r--r--kernel/cgroup/cgroup-internal.h2
-rw-r--r--kernel/cgroup/cgroup.c14
-rw-r--r--kernel/cgroup/cpuset.c11
-rw-r--r--kernel/cgroup/debug.c4
5 files changed, 28 insertions, 4 deletions
diff --git a/include/linux/cgroup-defs.h b/include/linux/cgroup-defs.h
index 5e1694fe035b..8fcbae1b8db0 100644
--- a/include/linux/cgroup-defs.h
+++ b/include/linux/cgroup-defs.h
@@ -92,6 +92,7 @@ enum {
92 92
93 CFTYPE_NO_PREFIX = (1 << 3), /* (DON'T USE FOR NEW FILES) no subsys prefix */ 93 CFTYPE_NO_PREFIX = (1 << 3), /* (DON'T USE FOR NEW FILES) no subsys prefix */
94 CFTYPE_WORLD_WRITABLE = (1 << 4), /* (DON'T USE FOR NEW FILES) S_IWUGO */ 94 CFTYPE_WORLD_WRITABLE = (1 << 4), /* (DON'T USE FOR NEW FILES) S_IWUGO */
95 CFTYPE_DEBUG = (1 << 5), /* create when cgroup_debug */
95 96
96 /* internal flags, do not use outside cgroup core proper */ 97 /* internal flags, do not use outside cgroup core proper */
97 __CFTYPE_ONLY_ON_DFL = (1 << 16), /* only on default hierarchy */ 98 __CFTYPE_ONLY_ON_DFL = (1 << 16), /* only on default hierarchy */
diff --git a/kernel/cgroup/cgroup-internal.h b/kernel/cgroup/cgroup-internal.h
index 75568fcf2180..c950864016e2 100644
--- a/kernel/cgroup/cgroup-internal.h
+++ b/kernel/cgroup/cgroup-internal.h
@@ -11,6 +11,8 @@
11#define TRACE_CGROUP_PATH_LEN 1024 11#define TRACE_CGROUP_PATH_LEN 1024
12extern spinlock_t trace_cgroup_path_lock; 12extern spinlock_t trace_cgroup_path_lock;
13extern char trace_cgroup_path[TRACE_CGROUP_PATH_LEN]; 13extern char trace_cgroup_path[TRACE_CGROUP_PATH_LEN];
14extern bool cgroup_debug;
15extern void __init enable_debug_cgroup(void);
14 16
15/* 17/*
16 * cgroup_path() takes a spin lock. It is good practice not to take 18 * cgroup_path() takes a spin lock. It is good practice not to take
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 2e5d90dfcb49..ed7f0bfe6429 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -86,6 +86,7 @@ EXPORT_SYMBOL_GPL(css_set_lock);
86 86
87DEFINE_SPINLOCK(trace_cgroup_path_lock); 87DEFINE_SPINLOCK(trace_cgroup_path_lock);
88char trace_cgroup_path[TRACE_CGROUP_PATH_LEN]; 88char trace_cgroup_path[TRACE_CGROUP_PATH_LEN];
89bool cgroup_debug __read_mostly;
89 90
90/* 91/*
91 * Protects cgroup_idr and css_idr so that IDs can be released without 92 * Protects cgroup_idr and css_idr so that IDs can be released without
@@ -3639,7 +3640,8 @@ restart:
3639 continue; 3640 continue;
3640 if ((cft->flags & CFTYPE_ONLY_ON_ROOT) && cgroup_parent(cgrp)) 3641 if ((cft->flags & CFTYPE_ONLY_ON_ROOT) && cgroup_parent(cgrp))
3641 continue; 3642 continue;
3642 3643 if ((cft->flags & CFTYPE_DEBUG) && !cgroup_debug)
3644 continue;
3643 if (is_add) { 3645 if (is_add) {
3644 ret = cgroup_add_file(css, cgrp, cft); 3646 ret = cgroup_add_file(css, cgrp, cft);
3645 if (ret) { 3647 if (ret) {
@@ -5743,6 +5745,16 @@ static int __init cgroup_disable(char *str)
5743} 5745}
5744__setup("cgroup_disable=", cgroup_disable); 5746__setup("cgroup_disable=", cgroup_disable);
5745 5747
5748void __init __weak enable_debug_cgroup(void) { }
5749
5750static int __init enable_cgroup_debug(char *str)
5751{
5752 cgroup_debug = true;
5753 enable_debug_cgroup();
5754 return 1;
5755}
5756__setup("cgroup_debug", enable_cgroup_debug);
5757
5746/** 5758/**
5747 * css_tryget_online_from_dir - get corresponding css from a cgroup dentry 5759 * css_tryget_online_from_dir - get corresponding css from a cgroup dentry
5748 * @dentry: directory dentry of interest 5760 * @dentry: directory dentry of interest
diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
index c739fda805e0..b897314bab53 100644
--- a/kernel/cgroup/cpuset.c
+++ b/kernel/cgroup/cpuset.c
@@ -2204,6 +2204,7 @@ typedef enum {
2204 FILE_MEMLIST, 2204 FILE_MEMLIST,
2205 FILE_EFFECTIVE_CPULIST, 2205 FILE_EFFECTIVE_CPULIST,
2206 FILE_EFFECTIVE_MEMLIST, 2206 FILE_EFFECTIVE_MEMLIST,
2207 FILE_SUBPARTS_CPULIST,
2207 FILE_CPU_EXCLUSIVE, 2208 FILE_CPU_EXCLUSIVE,
2208 FILE_MEM_EXCLUSIVE, 2209 FILE_MEM_EXCLUSIVE,
2209 FILE_MEM_HARDWALL, 2210 FILE_MEM_HARDWALL,
@@ -2382,6 +2383,9 @@ static int cpuset_common_seq_show(struct seq_file *sf, void *v)
2382 case FILE_EFFECTIVE_MEMLIST: 2383 case FILE_EFFECTIVE_MEMLIST:
2383 seq_printf(sf, "%*pbl\n", nodemask_pr_args(&cs->effective_mems)); 2384 seq_printf(sf, "%*pbl\n", nodemask_pr_args(&cs->effective_mems));
2384 break; 2385 break;
2386 case FILE_SUBPARTS_CPULIST:
2387 seq_printf(sf, "%*pbl\n", cpumask_pr_args(cs->subparts_cpus));
2388 break;
2385 default: 2389 default:
2386 ret = -EINVAL; 2390 ret = -EINVAL;
2387 } 2391 }
@@ -2634,6 +2638,13 @@ static struct cftype dfl_files[] = {
2634 .flags = CFTYPE_NOT_ON_ROOT, 2638 .flags = CFTYPE_NOT_ON_ROOT,
2635 }, 2639 },
2636 2640
2641 {
2642 .name = "cpus.subpartitions",
2643 .seq_show = cpuset_common_seq_show,
2644 .private = FILE_SUBPARTS_CPULIST,
2645 .flags = CFTYPE_DEBUG,
2646 },
2647
2637 { } /* terminate */ 2648 { } /* terminate */
2638}; 2649};
2639 2650
diff --git a/kernel/cgroup/debug.c b/kernel/cgroup/debug.c
index 9caeda610249..5f1b87330bee 100644
--- a/kernel/cgroup/debug.c
+++ b/kernel/cgroup/debug.c
@@ -373,11 +373,9 @@ struct cgroup_subsys debug_cgrp_subsys = {
373 * On v2, debug is an implicit controller enabled by "cgroup_debug" boot 373 * On v2, debug is an implicit controller enabled by "cgroup_debug" boot
374 * parameter. 374 * parameter.
375 */ 375 */
376static int __init enable_cgroup_debug(char *str) 376void __init enable_debug_cgroup(void)
377{ 377{
378 debug_cgrp_subsys.dfl_cftypes = debug_files; 378 debug_cgrp_subsys.dfl_cftypes = debug_files;
379 debug_cgrp_subsys.implicit_on_dfl = true; 379 debug_cgrp_subsys.implicit_on_dfl = true;
380 debug_cgrp_subsys.threaded = true; 380 debug_cgrp_subsys.threaded = true;
381 return 1;
382} 381}
383__setup("cgroup_debug", enable_cgroup_debug);