mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 22:21:42 +00:00
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>
This commit is contained in:
parent
90e92f2d55
commit
5cf8114d6e
@ -92,6 +92,7 @@ enum {
|
||||
|
||||
CFTYPE_NO_PREFIX = (1 << 3), /* (DON'T USE FOR NEW FILES) no subsys prefix */
|
||||
CFTYPE_WORLD_WRITABLE = (1 << 4), /* (DON'T USE FOR NEW FILES) S_IWUGO */
|
||||
CFTYPE_DEBUG = (1 << 5), /* create when cgroup_debug */
|
||||
|
||||
/* internal flags, do not use outside cgroup core proper */
|
||||
__CFTYPE_ONLY_ON_DFL = (1 << 16), /* only on default hierarchy */
|
||||
|
@ -11,6 +11,8 @@
|
||||
#define TRACE_CGROUP_PATH_LEN 1024
|
||||
extern spinlock_t trace_cgroup_path_lock;
|
||||
extern char trace_cgroup_path[TRACE_CGROUP_PATH_LEN];
|
||||
extern bool cgroup_debug;
|
||||
extern void __init enable_debug_cgroup(void);
|
||||
|
||||
/*
|
||||
* cgroup_path() takes a spin lock. It is good practice not to take
|
||||
|
@ -86,6 +86,7 @@ EXPORT_SYMBOL_GPL(css_set_lock);
|
||||
|
||||
DEFINE_SPINLOCK(trace_cgroup_path_lock);
|
||||
char trace_cgroup_path[TRACE_CGROUP_PATH_LEN];
|
||||
bool cgroup_debug __read_mostly;
|
||||
|
||||
/*
|
||||
* Protects cgroup_idr and css_idr so that IDs can be released without
|
||||
@ -3639,7 +3640,8 @@ restart:
|
||||
continue;
|
||||
if ((cft->flags & CFTYPE_ONLY_ON_ROOT) && cgroup_parent(cgrp))
|
||||
continue;
|
||||
|
||||
if ((cft->flags & CFTYPE_DEBUG) && !cgroup_debug)
|
||||
continue;
|
||||
if (is_add) {
|
||||
ret = cgroup_add_file(css, cgrp, cft);
|
||||
if (ret) {
|
||||
@ -5743,6 +5745,16 @@ static int __init cgroup_disable(char *str)
|
||||
}
|
||||
__setup("cgroup_disable=", cgroup_disable);
|
||||
|
||||
void __init __weak enable_debug_cgroup(void) { }
|
||||
|
||||
static int __init enable_cgroup_debug(char *str)
|
||||
{
|
||||
cgroup_debug = true;
|
||||
enable_debug_cgroup();
|
||||
return 1;
|
||||
}
|
||||
__setup("cgroup_debug", enable_cgroup_debug);
|
||||
|
||||
/**
|
||||
* css_tryget_online_from_dir - get corresponding css from a cgroup dentry
|
||||
* @dentry: directory dentry of interest
|
||||
|
@ -2204,6 +2204,7 @@ typedef enum {
|
||||
FILE_MEMLIST,
|
||||
FILE_EFFECTIVE_CPULIST,
|
||||
FILE_EFFECTIVE_MEMLIST,
|
||||
FILE_SUBPARTS_CPULIST,
|
||||
FILE_CPU_EXCLUSIVE,
|
||||
FILE_MEM_EXCLUSIVE,
|
||||
FILE_MEM_HARDWALL,
|
||||
@ -2382,6 +2383,9 @@ static int cpuset_common_seq_show(struct seq_file *sf, void *v)
|
||||
case FILE_EFFECTIVE_MEMLIST:
|
||||
seq_printf(sf, "%*pbl\n", nodemask_pr_args(&cs->effective_mems));
|
||||
break;
|
||||
case FILE_SUBPARTS_CPULIST:
|
||||
seq_printf(sf, "%*pbl\n", cpumask_pr_args(cs->subparts_cpus));
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
}
|
||||
@ -2634,6 +2638,13 @@ static struct cftype dfl_files[] = {
|
||||
.flags = CFTYPE_NOT_ON_ROOT,
|
||||
},
|
||||
|
||||
{
|
||||
.name = "cpus.subpartitions",
|
||||
.seq_show = cpuset_common_seq_show,
|
||||
.private = FILE_SUBPARTS_CPULIST,
|
||||
.flags = CFTYPE_DEBUG,
|
||||
},
|
||||
|
||||
{ } /* terminate */
|
||||
};
|
||||
|
||||
|
@ -373,11 +373,9 @@ struct cgroup_subsys debug_cgrp_subsys = {
|
||||
* On v2, debug is an implicit controller enabled by "cgroup_debug" boot
|
||||
* parameter.
|
||||
*/
|
||||
static int __init enable_cgroup_debug(char *str)
|
||||
void __init enable_debug_cgroup(void)
|
||||
{
|
||||
debug_cgrp_subsys.dfl_cftypes = debug_files;
|
||||
debug_cgrp_subsys.implicit_on_dfl = true;
|
||||
debug_cgrp_subsys.threaded = true;
|
||||
return 1;
|
||||
}
|
||||
__setup("cgroup_debug", enable_cgroup_debug);
|
||||
|
Loading…
Reference in New Issue
Block a user