/** * blkcg_policy_register - register a blkcg policy * @pol: blkcg policy to register * * Register @pol with blkcg core. Might sleep and @pol may be modified on * successful registration. Returns 0 on success and -errno on failure. */ intblkcg_policy_register(struct blkcg_policy *pol) { structblkcg *blkcg; int i, ret; .... /* register @pol */ pol->plid = i; blkcg_policy[pol->plid] = pol;
/* allocate and install cpd's */ if (pol->cpd_alloc_fn) { list_for_each_entry(blkcg, &all_blkcgs, all_blkcgs_node) { structblkcg_policy_data *cpd;
cpd = pol->cpd_alloc_fn(GFP_KERNEL); ... blkcg->cpd[pol->plid] = cpd; // 看到现在对这些不是很明白 cpd->blkcg = blkcg; cpd->plid = pol->plid; pol->cpd_init_fn(cpd); } } .. /* everything is in place, add intf files for the new policy */ if (pol->dfl_cftypes) // cgroup_add_dfl_cftypes 函数描述 add an array of cftypes for default hierarchy // Similar to cgroup_add_cftypes() but the added files are only used for the default hierarchy. WARN_ON(cgroup_add_dfl_cftypes(&io_cgrp_subsys, pol->dfl_cftypes)); if (pol->legacy_cftypes) // cgroup_add_legacy_cftypes - add an array of cftypes for legacy hierarchies // Similar to cgroup_add_cftypes() but the added files are only used for the legacy hierarchies. // 其实到这里我们知道这个地方就是处理文件初始化的地方, 这里说的是文件初始化不包含内容正确. // 这里在 cgroup fs blkio 中创建文件的地方, 拼接名字也是在这里完成的. WARN_ON(cgroup_add_legacy_cftypes(&io_cgrp_subsys, pol->legacy_cftypes)); .... // 移除一些错误处理的代码,主要是内核分配内存失败释放内存的逻辑 EXPORT_SYMBOL_GPL(blkcg_policy_register);
下面这个就是按照内核提供的 cgroup 框架实现的一个 controller group 的 sub system 名字叫 blkio, 其实 cgroup 框架的抽象也能猜测行为, 如果猜的不对可以看 kernel/cgroup.c 中的调用方式.