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

Re: -current kernel hang up



谷川です。

もっと早く出そうと思っていたのですが、
色々と手間取ってしまいました。

From: Takeshi Shibagaki<ie9t-sbgk@asahi-net.or.jp>
Date: Sun, 26 Aug 2001 02:53:14 +0900

> > このあたりは見ていないのですが、uvm回りで落ちていたので、MIな
> > ところなのでは? と思っています。
> 
> と思ったら違うかも。
> 
> db> t
> _cpu_Debugger(400,a8c,c,7c68414,7abf1c) + 6
> _panic(15ebc6,0,7c68414,7abf34,15e46e) + 9c
> _amap_wipeout(7c68414,7d63cd4,0,7d63cd4,7abf5c) + 30
> _amap_unref(7c68414,0,a8c,0) + 20
> _uvm_unmap_detach(7d63454,0) + 54
> _uvmspace_free(79fe10,7c8d38c,2006fc,7abfa8,3483e) + d4
> _uvm_exit(7c8d38c,347ee,79a540,28aea0,3062) + 14
> _reaper(79a540) +4a
> _proc_trampoline() + 2

私のマシンでは libc を make したり、/usr/src を他のマシンから
rsync したりすると落ちていました。
観察した限りでは、make や rsync 等のプロセスが 10MB 程度
メモリを消費すると落ちている感じでした。

どこから手を着ければいいのか分からなかったので、とりあえず config で
  options        DEBUG
を有効にして kernel を作ってみました。
すると、boot の途中でデバッガに落ちます。

http://mail-index.netbsd.org/source-changes/2001/08/04/0033.html
の変更箇所のようです。

boot device: sd0
root on sd0a dumps on s0b
panic: kernel diagnostic assertion "pv->pv_pmap != pmap_kernel() || pv->pv_va != sva" failed: file "../../../../arch/mac68k/mac68k/pmap.c", line 1383

Stopped in pid 0 (swapper) at  _cpt_Debugger+0x6:   unlk  a6
db> t
_cpu_Debugger(5bf,5b50000,1,18be3c,18bdfc) + 6
_panic(fe268,f1cd2,f3736,f3585,567) + 9c
___assert(f1cd2,f3585,567,f3736,1000) + 18
_pmap_kremove(5b50000,1000,1000,5000,4a84c) + 158
_pagemove(5b50000,5b61000,1000,ff,1) + 80
_allocbuf(8728e4,4200,54fc00,54fc00,18bee4) + a8
_geteblk(4200,ff,1,54fc00,54fe00) + 4a
_readdisklabel(2,e2232,54fc00,509e60) + 3a
_sdgetdisklabel(54fe00) + 54
_sdopen(401,0,6000,0) + 14c
_sdsize(401,502000,37b64,c,d) + 60
_cpu_dumpconf(14147,8da0,8006047a,f9001000,0) + 46
uvm_fault(0x110d2c, 0x18e000, 0, 0x1) -> 0xe
  type 8, code [mmu,,ssw]: 505
trap type 8, code = 0x505, v = 0x18effa
kernel program counter = 0xea5ec
kernel: MMU fault trap
Caught exception in ddb.
_main() + 492
_main() + 492

そこで、/sys/arch/mac68k/mac68k/pmap.c の中の pmap_kremove() を
hp300, mvme68k 等の他の m68k アーキテクチャと比較したところ、
1400 行目付近のコード (ここでは #ifdef DEBUG を除いています) において

while (sva < nssva) {
    if (pmap_pte_v(pte)) {
        /*
         * Update statistics
         */
        pmap->pm_stats.wired_count--;
        pmap->pm_stats.resident_count--;

        /*
         * Invalidate the PTE.
         */

        *pte = PG_NV;
        TBIS(va);                       <---- ここは TBIS(sva); では?
    }
    pte++;
    sva += NBPG;
}

という結論に達したのですが、最近 C のプログラミングをやっていないので
いまいち自信が持てません。
mac68k のこの部分のコードは hp300 から持ってきたようなのですが、
hp300 で pmap_remove(), pmap_remove_mapping() から pmap_kremove() に
コードを移してきたときに変数名を修正し忘れたように見えます。

この変更を施した kernel をちょっと動かした限りでは
落ちなくなっているようです。

---
谷川裕樹  Hiroki TANIKAWA
e-mail: tanh@tk.airnet.ne.jp