root domain
struct root_domain
root domain이 사용되는 곳
cfs task
- update_sd_lb_stats
- 스케쥴링그룹에 속한 cpu중 하나라도 nr_running이 1이상일 때 dst_rq가 속한 root domain의 overload를 갱신함
- 최상위 sched domain일 경우에만 설정함
- 스케쥴링그룹에 속한 cpu중 하나라도 nr_running이 1이상일 때 dst_rq가 속한 root domain의 overload를 갱신함
- idle_balance
- this_rq가 속한 root domain의 overload가 0이 아닐 경우에만 idle balance를 진행함
rt, dl task
cpu와의 연결시점
sched_init()
부팅도중에 호출되는 sched_init()에서 모든 possible cpu는 def_root_domain과 연결된다.
- this_rq가 속한 root domain의 overload가 0이 아닐 경우에만 idle balance를 진행함
void __init sched_init(void)
{
...
for_each_possible_cpu(i) {
...
rq_attach_root(rq, &def_root_domain);
}
build_sched_domains()
이 함수에서는 인자로 넘어온 @cpu_map을 사용해서 스케쥴링 도메인 토폴로지를 완성하고 난 후에 아래와 같이 새롭게 할당한 root domain과 연결한다.
static int build_sched_domains(const struct cpumask *cpu_map,
struct sched_domain_attr *attr)
{
...
for_each_cpu(i, cpu_map) {
sd = *per_cpu_ptr(d.sd, i);
cpu_attach_domain(sd, d.rd, i);
}
...
}
build_sched_domains()는
- 부팅중에 호출되는 sched_init_smp() -> init_sched_domains()에서 호출됨.
- cpu_active_map에 설정된 cpu를 새 root_domain과 연결함
- cpu hotplug 이벤트가 발생하면 호출됨
- cpuset과 관련이 있을것임. cpuset마다 root_domain이 매칭될듯..