3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

memoryのECC errorがどうやって検出されているか調べる

Last updated at Posted at 2017-12-27

仕事で、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

たぶん、

  1. sbridge_mce_check_error()
  2. sbridge_mce_output_error()
  3. edac_mc_handle_error()
  4. edac_raw_mc_handle_error()

の流れ。

sbridge_mce_check_error()は、sbridge_init()でsbridge_mce_decとして登録されているみたい。sb_edacがloadされると、

  1. sbridge_init()
  2. mce_register_decode_chain()
  3. 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()との関係性が分からない。

  1. do_machine_check()
  2. mce_log()
  3. irq_work_queue()

でmce_irq_workを登録しているのだろうか。irq_workの仕組みがまだよく分かっていない。
mcheck_init()で

  • init_irq_work(&mce_irq_work, mce_irq_work_cb);

している。また、

  1. mce_irq_work_cb()
  2. mce_schedule_work()
  3. 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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?