linux源码分析(四)-start_kernel-cgroup
从cgroup_init_early函数学习cgroup——框架
/* * 系统中共有多少个cgroup_subsys_state结构体?include/linux/cgroup.h * */ /* Define the enumeration of all cgroup subsystems */ #define SUBSYS(_x) _x ## _subsys_id, /* cgroup_subsys.h内容如下 SUBSYS(cpuset) cpuset_subsys_id SUBSYS(debug) debug_subsys_id SUBSYS(ns) ns_subsys_id SUBSYS(cpu_cgroup) cpu_cgroup_subsys_id SUBSYS(cpuacct) cpuacct_subsys_id SUBSYS(mem_cgroup) mem_cgroup_subsys_id SUBSYS(devices) devices_subsys_id SUBSYS(freezer) freezer_subsys_id SUBSYS(net_cls) net_cls_subsys_id */ enum cgroup_subsys_id { #include <linux/cgroup_subsys.h> CGROUP_SUBSYS_COUNT }; #undef SUBSYS /*以上枚举量展开为*/ enum cgroup_subsys_id { cpuset_subsys_id debug_subsys_id ns_subsys_id cpu_cgroup_subsys_id cpuacct_subsys_id mem_cgroup_subsys_id devices_subsys_id freezer_subsys_id net_cls_subsys_id CGROUP_SUBSYS_COUNT }; /*系统中定义的全局cgroup_subsys数组*/ /* Generate an array of cgroup subsystem pointers */ #define SUBSYS(_x) &_x ## _subsys, static struct cgroup_subsys *subsys[] = { #include <linux/cgroup_subsys.h> }; /*以上数组展开为*/ static struct cgroup_subsys *subsys[] = { cpuset_subsys, debug_subsys, ns_subsys, cpu_cgroup_subsys, cpuacct_subsys, mem_cgroup_subsys, devices_subsys, freezer_subsys, net_cls_subsys, }; /*以上数组中的成员在不同的C文件中定义,例如kernel/cpuset.c*/ struct cgroup_subsys cpuset_subsys = { .name = "cpuset", .create = cpuset_create, .destroy = cpuset_destroy, .can_attach = cpuset_can_attach, .attach = cpuset_attach, .populate = cpuset_populate, .post_clone = cpuset_post_clone, .subsys_id = cpuset_subsys_id, .early_init = 1, }; static int cpuset_mems_generation; static struct cpuset top_cpuset = { .flags = ((1 << CS_CPU_EXCLUSIVE) | (1 << CS_MEM_EXCLUSIVE)), }; struct cpuset { struct cgroup_subsys_state css; unsigned long flags; /* "unsigned long" so bitops work */ cpumask_var_t cpus_allowed; /* CPUs allowed to tasks in cpuset */ nodemask_t mems_allowed; /* Memory Nodes allowed to tasks */ struct cpuset *parent; /* my parent */ /* * Copy of global cpuset_mems_generation as of the most * recent time this cpuset changed its mems_allowed. */ int mems_generation; struct fmeter fmeter; /* memory_pressure filter */ /* partition number for rebuild_sched_domains() */ int pn; /* for custom sched domain */ int relax_domain_level; /* used for walking a cpuset heirarchy */ struct list_head stack_list; };