livaの雑記帳

livaの雑記帳

OSとか作ってみたい

LinuxのCPU hotplugについて調べてみる。

諸事情によりLinuxのCPU hotplugについて調べてみたくなったので。

 

とりあえず試してみたいので、やり方を調べた。

NAKAMURA Minoru's Diary (2006年3月)

 

要するに、rootで以下のようにすれば良いとの事。

# echo 0 > /sys/devices/system/cpu/cpu1/online

/proc/cpuinfoからも見えなくなる。凄い。

そして1を突っ込むとまた復活する。凄い。

どういう仕組が知りたいので、調べてみる。

 

dmesgを読むと、

smpboot: CPU 1 is now offline

というのが出てるので、それっぽい関数にアタリを付ける。

arch/x86/kernel/smpboot.c内のnative_cpu_die()っぽい。

 

どういう経路でこいつが呼ばれてるか知りたいので、stacktraceを取得する。

kernhack.hatenablog.com

 

Linuxカーネルってこんな事できるのか。。。すごすぎでは。

 

#!/usr/bin/env stap

 

probe begin {

}

 

probe kernel.function("native_cpu_die") {

        print_backtrace()

        exit()

}

 

probe end {

printf("Done\n")

}

こんなスクリプトを書いて実行すると、以下のようなスタックトレースが取れる。

0xffffffff81040ee0 : native_cpu_die+0x0/0x80 [kernel]

0xffffffff816fa6be : _cpu_down+0x17e/0x2c0 [kernel]

0xffffffff816fa834 : cpu_down+0x34/0x50 [kernel]

0xffffffff81488bf4 : cpu_subsys_offline+0x14/0x20 [kernel]

0xffffffff81483ec5 : device_offline+0x95/0xc0 [kernel]

0xffffffff81483fc0 : online_store+0x40/0x90 [kernel]

0xffffffff814814b8 : dev_attr_store+0x18/0x30 [kernel]

0xffffffff8122f978 : sysfs_write_file+0x128/0x1c0 [kernel]

0xffffffff811b8c44 : vfs_write+0xb4/0x1f0 [kernel]

0xffffffff811b9679 : sys_write+0x49/0xa0 [kernel]

0xffffffff81719c6d : system_call_fastpath+0x1a/0x1f [kernel]

drivers/base/cpu.c内のcpu_subsys_offline()が呼ばれて、kernel/cpu.cのcpu_down()が呼ばれ、__cpu_die()経由でnative_cpu_die()が呼ばれる、と。

 

逆に起こす時は、cpu_subsys_online()からcpu_up()が呼ばれ、native_cpu_up()が呼ばれるという流れ。

native_cpu_up()はdo_boot_cpu(), wakeup_cpu_via_init_nmi()を経由して、wakeup_secondary_cpu_via_init()を呼び、MPの初期化が行われる。初期化されたコアのエントリポイントはstart_eipで指定される。このstart_eipはdo_boot_cpu()内で

real_mode_header->trampoline_startが指定されている。

 

trampoline_startは、arch/x86/realmode/rm/header.Sで定義されている通り、pa_trampoline_startである。