Linuxブート時のcpu数認識の処理を読む

Linuxブート時のcpu数認識の最後の部分のこれ。

[    0.000000] smpboot: Allowing 8 CPUs, 0 hotplug CPUs

このメッセージはarch/x86/kernel/smpboot.cにあるprefill_possible_map()が出している。

1252         pr_info("Allowing %d CPUs, %d hotplug CPUs\n",
1253                 possible, max_t(int, possible - num_processors, 0));

possibleは以下のような処理で決定してしている。

1222         if (setup_possible_cpus == -1) {
1223                 possible = num_processors;
1224 #ifdef CONFIG_HOTPLUG_CPU
1225                 if (setup_max_cpus)
1226                         possible += disabled_cpus;
1227 #else
1228                 if (possible > i)
1229                         possible = i;
1230 #endif
1231         } else
1232                 possible = setup_possible_cpus;

setup_possible_cpusは初期値-1のグローバル変数。ソースを見た感じだとカーネルの起動時のオプションで設定する程度かな。

1187 static int __initdata setup_possible_cpus = -1;
1188 static int __init _setup_possible_cpus(char *str)
1189 {
1190         get_option(&str, &setup_possible_cpus);
1191         return 0;
1192 }
1193 early_param("possible_cpus", _setup_possible_cpus);

なので、通常は-1になっていてnum_processorsが使われるんじゃないかと。

num_processorsは前回のソースを見ている時に出てきていて、カーネルが認識したcpu数になっている。
prefill_possible_map()が呼ばれた段階でもcpu数が未設定の場合は1が設定される。

1217         /* no processor from mptable or madt */
1218         if (!num_processors)
1219                 num_processors = 1;

そして冒頭のpr_info()でcpu数を出す感じ。
この関数は最後に以下の処理をして、カーネルが認識したcpuに関しては有効だよーとして、それ以外の分は使えないのでfalseを設定する。

1255         for (i = 0; i < possible; i++)
1256                 set_cpu_possible(i, true);
1257         for (; i < NR_CPUS; i++)
1258                 set_cpu_possible(i, false);

このcpuのビットマスクはlinux/cpumask.hで定義されている。

 14 typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;

NR_CPUSはコンパイル時に決定している値でうちの環境だと128。

masami@saga:~/linux-kernel (vanilla)$ grep -n NR_CPUS .config
399:CONFIG_NR_CPUS=128

と言う訳でdmesgのLinuxカーネルがsmpの設定している部分のログからどうやってcpuの認識をしているのかを追いかけてきてここまで着たと。

[    0.000000] found SMP MP-table at [mem 0x000fd7d0-0x000fd7df] mapped at [ffff8800000fd7d0]
[    0.000000] Using ACPI (MADT) for SMP configuration information
[    0.000000] smpboot: Allowing 8 CPUs, 0 hotplug CPUs

基本的な流れはこんな感じかな。

  1. IntelMulti Processor SpecitificationにあるMP Floating Pointer Structureを探して、MP構成か調べる
  2. ACPIのMADTにあるデータ構造を見ていき、cpuを調べる
  3. 見つかったcpu数を表示

cpu数の表示は今回見たところで、それ以前の部分を調べた記事はこちら。

プロセッサを支える技術  ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)

プロセッサを支える技術  ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)