遍历需要 migrate 的进程,调用 css_set_move_task(task, from_cset, to_cset, true),进程的 css_set 得到更新。 回调有变动的 ss 的 ss->attach,migrate 正式生效。 cpuset 的 attach 由 cpuset_attach 函数实现,核心逻辑如下: cgroup_taskset_for_each(task, css, tset) { WARN_ON_ONCE(set_cpus_al...
- @tset包含这个线程组的所有task,不管这些task是否需要切换cgroup(@tset contains all tasks from the thread group whether or not they're switching cgroups) - 里面第一个task是线程组leader 每个@tset同样包含task原来的cgroup,同一个线程组下没有进行cgroup切换的task可以通过cgroup_taskset_for_each()迭代器...
每个@tset条目还包含任务的旧cgroup,并且可以使用 cgroup_taskset_for_each() 迭代器轻松跳过未切换cgroup的任务。 请注意,这不是在fork上调用的。 如果此方法返回0(成功),则在调用方持有 cgroup_mutex 的同时应保持有效,并确保将来会调用attach() 或cancel_attach() 。 voidcss_reset(structcgroup_subsys_state ...
RCU_INIT_POINTER(init_task.cgroups, &init_css_set); for_each_subsys(ss, i) { ss->id = i; ss->name = cgroup_subsys_name[i]; if (ss->early_init) cgroup_init_subsys(ss, true); } return 0; } CGroup的起点是start_kernel->cgroup_init,进入CGroup的初始化,主要注册cgroup文件系统和创建...
set_bit(CGRP_CPUSET_CLONE_CHILDREN, &cgrp->flags); for_each_subsys(root, ss) { struct cgroup_subsys_state *css; css = ss->css_alloc(cgrp); // mount时各个subsys的钩子函数已经注册,这里直接使用来创建各个subsys的结构(task_group) init_cgroup_css(css, ss, cgrp); //初始化cgroup_subsys_st...
int __init cgroup_init_early(void) { static struct cgroup_sb_opts __initdata opts; struct cgroup_subsys *ss; int i; init_cgroup_root(&cgrp_dfl_root, &opts); cgrp_dfl_root.cgrp.self.flags |= CSS_NO_REF; RCU_INIT_POINTER(init_task.cgroups, &init_css_set); for_each_subsys(ss,...
第一个参数 src_cset 表示进程原来的 css_set,也就是 task_struct 的 cgroups 字段。 首先要做的就是在目标 cgroup(dst_cgrp,也就是 /cpuset1)所属的 cgroup_root 中找到原 cgroup(src_cgrp,也就是 /cpuset0),它跟目标 cgroup 属于同一个cgroup_root,查找的过程就变成找到 src_cset 对应的某个 cgroup...
set_bit(CGRP_CPUSET_CLONE_CHILDREN, &cgrp->flags); for_each_subsys(root, ss) { struct cgroup_subsys_state *css; css = ss->css_alloc(cgrp); // mount时各个subsys的钩子函数已经注册,这里直接使用来创建各个subsys的结构(task_group) init_cgroup_css(css, ss, cgrp); //初始化cgroup_subsys_st...
cgrp_dfl_root.cgrp.self.flags |= CSS_NO_REF;RCU_INIT_POINTER(init_task.cgroups, &init_css_set);for_each_subsys(ss, i) {WARN(!ss->css_alloc || !ss->css_free || ss->name || ss->id,"invalid cgroup_subsys %d:%s css_alloc=%p css_free=%p id:name=%d:%s\n", ...
set_bit(CGRP_CPUSET_CLONE_CHILDREN, &cgrp->flags); for_each_subsys(root, ss) { struct cgroup_subsys_state *css; css = ss->css_alloc(cgrp); // mount时各个subsys的钩子函数已经注册,这里直接使用来创建各个subsys的结构(task_group) init_cgroup_css(css, ss, cgrp); //初始化cgroup_subsys_st...