[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: src/etc/Makefile



>・kernel diagnostic assertion "rv" failed で panic

これ、自宅ではどうしても発生しなかったので追求に時間がかかりましたが
ようやく分かって来ました。
# 正確には原因まではすぐにわかったんだけど…

現時点での結論は、pmap_kenter_pa()/pmap_kremove() を実装する、じゃ
ないかと思われます。(まだ耐久テスト中)


くわしい状況ですが、

panic: kernel diagnostic assertion "rv" failed: file "../../../../uvm/uvm_pager_i.h", line 64
Stopped in pid 8 (aiodoned) at  cpu_Debugger+0x10:      lwz     0,20(1)
db> t
at panic+158
at __assert+2c
at uvm_pageratop+44
at uvm_aio_aiodone+128
at uvm_aiodone_daemon+b4
at fork_trampoline+10

で uvm_aiodone_daemon() で TAILQ_FIRST(&uvm.aio_done) からもってきた
bp が壊れてると言っています。

uvm.aio_done に書き込んでいるのは、そこに Debugger() を入れて見て
みると、

Stopped at      cpu_Debugger+0x10:      lwz     0,20(1)
db> t
at uvm_aio_biodone+3c
at biodone+ac
at wddone+1c4
at wdc_ata_bio_done+b4
at wdc_ata_bio_intr+440
at wdcintr+110
at pciide_pci_intr+68
at ext_intr_openpic+c4
at extint_call+0
at cpu_switch+30
at mi_switch+1ac
at ltsleep+250
at uvm_aiodone_daemon+74
at fork_trampoline+10

こんな感じ。uvm_aio_biodone() ではすでに壊れています。

調べてみると wdstart 辺りでは bp->b_data を変換できる(pmap_extract
できる)のに wddone ではダメな状況がときどき発生しています。

というわけで誰がアンマップしてるのか調べてみたら、

at pmap_page_protect+340
at genfs_putpages+478
at uvn_put+48
at uvm_vnp_setsize+a0
at ffs_truncate+534
at ufs_inactive+dc
at vput+138
at ufs_remove+94
at sys_unlink+198
at trap+418

ってのがありました。syscall のあたりは sys_close もたまに出ますが、
後のほうはいつも同じ。
# ディスク待ちしてるページを別のプロセスが unlink した?

この genfs_putpages() ってのは pg->flags & (PG_RELEASED|PG_PAGEOUT)
でないときは問答無用で pmap_page_protect(pg, VM_PROT_NONE) して
しまいます。

flags をいじるのは違うような気がするのでちょっと悩んでたんですが、
pmap_kenter_pa() すれば pv_list に載らないので pmap_page_protect()
に消されないんじゃないかと思ってやってみたところ、今のところまだ
例の assertion panic は出ていません。
# pmap_kenter_pa() は筒井さんが確認済みだったような気もしたけど…

でも uvm が、pmap_kenter_pa() したページは pmap_page_protect() の
対象にならないことを要求するってのは、なんだかなあ…。


余談ですが Chuck に NEWPMAP にしちゃうぞって最後通牒されてます。
もう口出しする気はないし、自分では今の NetBSD の arch/powerpc は
使ってないのでほっときますけど。