仕事で、memoryでECC errorが起きたときにどのように検出されるか調べる必要が出てきた。IntelのXeon想定。
なお、CPU周りについてもLinux kernelについてもどどどどど素人なので、一朝一夕のスキルしかない。
あと、単なる自分用のメモなので殴り書きです。
EDACというものでmemoryのECC errorを検出できるようだ。
https://ccmp.jp/engineerblog/81-linuxedacecc.html
EDACはドライバになっていて、これをloadすると有効になるっぽい。
drivers\edac\sb_edac.cとかdrivers\edac\skx_edac.cがXeon向けかな???
とりあえずsb_edac.cを調べる。あとkernel versionは4.14.3。
たぶん、errorの検出自体はMachine Check Exception(MCE)でやるっぽい。
EDACをloadしてECCをenabledにすると、MCEで上がってくるerrorも変わるのだろうか。。。
EDAC load前でmemory errorが起きるとMCi_STATUSのuncorrected errorが立つんだけど、EDAC load後には立たない、みたいな。
MCEについてはIntel SDMのchapter 15を見る。
https://www.intel.co.jp/content/www/jp/ja/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3b-part-2-manual.html
上のEDACのlink先で出ているmessageがどこで出されているのか調べる。
EDAC MC0: CE page 0x3e9, offset 0x380, grain 128, syndrome 0x91, row 0, channel 0, label "": i3000 CE
たぶん、
- sbridge_mce_check_error()
- sbridge_mce_output_error()
- edac_mc_handle_error()
- edac_raw_mc_handle_error()
の流れ。
sbridge_mce_check_error()は、sbridge_init()でsbridge_mce_decとして登録されているみたい。sb_edacがloadされると、
- sbridge_init()
- mce_register_decode_chain()
- blocking_notifier_chain_register()
を通ってx86_mce_decoder_chainにsbridge_mce_dec(sbridge_mce_check_error, priority = MCE_PRIO_EDAC)が、登録されるようだ。
mcheck_init()では同様に、
- first_nb
- mce_srao_nb
- mce_default_nb
が登録されている。これらのinitの後に、sb_edacがloadされると追加される感じではないだろうか。
Notification Chainsの勉強が必要な気がする。
https://www.safaribooksonline.com/library/view/understanding-linux-network/0596002556/ch04.html
実際にx86_mce_decoder_chainがcallされるのはどこだろう。
x86_mce_decoder_chainはmce_gen_pool_process()からcallされているように見える。そこからnotifier_call_chain()でchainをぐるぐる回っているのだと思われる。戻り値にNOTIFY_STOP_MASKが立っていたら終わりのようだ。
do_machine_check()がMCEのhandlerだと思うのだけど、sbridge_mce_check_error()との関係性が分からない。
- do_machine_check()
- mce_log()
- irq_work_queue()
でmce_irq_workを登録しているのだろうか。irq_workの仕組みがまだよく分かっていない。
mcheck_init()で
- init_irq_work(&mce_irq_work, mce_irq_work_cb);
している。また、
- mce_irq_work_cb()
- mce_schedule_work()
- schedule_work()
でmce_workをschedule_workしている。workqueueの仕組みもよく分かっていない。
さらにmcheck_init()で、
- INIT_WORK(&mce_work, mce_gen_pool_process);
している。
sbridge_mce_check_error()は本家のMCEの処理が終わった後のlog吐き出しくらいの機能かもしれない。。。
ひとつ気になるのがHPの以下のドキュメント。
EDACを使わずに自前の方法でerrorを検出するらしい。もしかして「いまどきの一般のserverはEDACなんて使ってない」だったりしないよね?
https://h20628.www2.hp.com/km-ext/content-webapp/document?docId=emr_na-c03520590