前言
在讲调度域的初始化之前我们不得不先说一下多CPU启动的一些基本知识点,不过我们的目的是聚焦于调度域,所以只会讲与调度相关的内容。
possible,present,online和active四大状态分别记录在__cpu_possible_mask,set_cpu_present,__cpu_online_mask和__cpu_active_mask这几个变量中。下面四个函数用于设置这四个状态。
static inline void
set_cpu_possible(unsigned int cpu, bool possible)
{
if (possible)
cpumask_set_cpu(cpu, &__cpu_possible_mask);
else
cpumask_clear_cpu(cpu, &__cpu_possible_mask);
}
static inline void
set_cpu_present(unsigned int cpu, bool present)
{
if (present)
cpumask_set_cpu(cpu, &__cpu_present_mask);
else
cpumask_clear_cpu(cpu, &__cpu_present_mask);
}
static inline void
set_cpu_online(unsigned int cpu, bool online)
{
if (online)
cpumask_set_cpu(cpu, &__cpu_online_mask);
else
cpumask_clear_cpu(cpu, &__cpu_online_mask);
}
static inline void
set_cpu_active(unsigned int cpu, bool active)
{
if (active)
cpumask_set_cpu(cpu, &__cpu_active_mask);
else
cpumask_clear_cpu(cpu, &__cpu_active_mask);
}
possible状态
possible标记一个可能存在的CPU。第一个启动的CPU称为boot CPU,该CPU肯定是存在的,否则系统无法启动,所以boot CPU初始化的时候会直接设置possible状态,当然对于boot CPU来说,它的present,online,active状态也是直接设置即可。
start_kernel->boot_cpu_init
void __init boot_cpu_init(void)
{
int cpu = smp_processor_id();
/* Mark the boot cpu "present", "online" etc for SMP and UP case */
set_cpu_online(cpu, true);
set_cpu_active(cpu, true);
set_cpu_present(cpu, true);
set_cpu_possible(cpu, true);
}
然而对于其他CPU来说,需要在DTS中描述,否则boot CPU不知道其他CPU的存在。下面是从内核代码arch/arm64/boot/dts/arm/juno.dts中摘录的关于CPU拓扑的描述:
cpus {
#address-cells = <2>;
#size-cells = <0>;
cpu-map {
cluster0 {
core0 {
cpu = <&A57_0>;
};
core1 {
cpu = <&A57_1>;
};
};
clus