【 SCHED 】聊聊 Schedule Domain 的构建
schedule domain 即为CPU调度域,在源码中经常定义为 sched_domain
提到了调度域那一定少不了 schedule group 调度组,
调试域将作为构建调度组的依赖,调度组中还有一个 capacity,可以用其来评估该组是否busy,
好,下面我们依次来分析它们的构建过程。
调度域会参考 CPU 的组成结构来构建,所以我们有必要先了解下 core 的解析过程,作为一个前期补充。
一、核拓扑解析
二、构建调度域
先来看构建调度域的入口,
int sched_init_domains(const struct cpumask *cpu_map)
{
...
arch_update_cpu_topology(); ( 1 )
asym_cpu_capacity_scan(); ( 2 )
ndoms_cur = 1;
doms_cur = alloc_sched_domains(ndoms_cur); ( 3 )
if (!doms_cur)
doms_cur = &fallback_doms;
cpumask_and(doms_cur[0], cpu_map,
housekeeping_cpumask(HK_FLAG_DOMAIN)); ( 4 )
err = build_sched_domains(doms_cur[0], NULL); ( 5 )
return err;
}
1)TODO: 不知用意
2)TODO: capacity 相关
3)动态分配一个cpumask_var空间,分配不成功就用fallback_doms代替;
4)这里是对系统中可用核心的一个约束,HK是housekeeping的缩写,例如我们在系统启动前通过isocpus指定了某些核心不参与常规的调度的话,那么将会被加入到housekeeping cpu中,所以这里在构建调度域前会前它们除去,当然housekeeping cpu在后面系统启动后我们是可以主动向已分离的核心分配任务的,主要看业务场景;
5)核心实现部分是build_sched_domains,里面包含了调度域、调度组以及capacity的解析构建;
我们将build_sched_domains来分层依次看吧,先看调度域,