💭

CPU HOTPLUG

2022/12/21に公開

CPU HOTPLUG

// cpuXを無効化
$ echo 0 > /sys/devices/system/cpu/cpuX/online
// cpuXを有効化
$ echo 1 > /sys/devices/system/cpu/cpuX/online

この結果cpu_online_maskの値が変化する。cpuinfoで結果を確認する。
$ cat /proc/cpuinfo

CPU MAP
cpu_possible_mask
システムで使用可能な CPU のビットマップ。これは、CPU が利用可能になったり削除されたりしたときに増減するように設計されていない。 per_cpu 変数に、ブート時のメモリを割り当てるために使用されます。ブート時の検出フェーズで一度設定されると、マップは静的で、ビットはいつでも追加または削除されません。

CPU_online_mask
現在オンラインになっているすべての CPU のビットマップ。CPU がカーネルのスケジューリングに使用できるようになり、 デバイスからの割り込みを受け取る準備ができた後、 __cpu_up() で設定されます。CPUを__cpu_disable()でダウンさせるとクリアされます。その前に、割り込みを含むすべてのOSサービスが別のターゲットCPUに移行します。

CPU_present_mask
システム内に現在存在するCPUのビットマップ。すべてのCPUがオンラインであるとは限りません。物理的なホットプラグが関連サブシステム (たとえば ACPI) によって処理されると、イベントに応じて新しいビットがマップから追加または削除されるように変更されることがあります。現在のところ、ロックルールはありません。典型的な使用法は、ブート中にトポロジーを開始し、その時点でホットプラグが無効になることです。

https://docs.kernel.org/core-api/cpu_hotplug.html

onlineとactiveで何が違うのか?

qemuでofflineにする手順をソース

sched_cpu_inactiveでbreakする
action引数に何が渡されるのか

http://vh21.github.io/linux/2015/04/28/linux-cpu-mask.html

offlineにするときの手順

  1. activeをOFFにする。 sched_cpu_deactivate
  2. ターゲットCPUを完全に削除する cpuset_cpu_inactive(cpu);
  3. onlineをOFFにする。 remove_cpu_from_maps()
    cpu_disable_commonのcpuにはターゲットCPU番号が入る。

qemuでofflineにする手順をソースで解説する

sched_cpu_inactiveでbreakする
action引数に何が渡されるのか
http://vh21.github.io/linux/2015/04/28/linux-cpu-mask.html

Discussion