login: Nov 15 06:50:14 livorno getty[588]: /dev/ttyE0: Device not configured
tlp0: transmit underrun; new threshold: 96/256 bytes
trap type 200 at 3a5b38
Stopped in pid 627.1 (cvs) at netbsd:cache_lookup+0xc4: cmpw 7,0,30
db> tlp0: receive ring overrun
reboot
syncing disks... 21 14 9 done
unmounting file systems...panic: lockmgr: draining against myself
single user で network が動いていない時でも
gcc-3.4.4/gcc/config/alpha/alpha.h
gcc-3.4.4/gcc/config/alpha/alpha.md
gcc-3.4.4/gcc/configtrap type 300 at 3a5b34
Stopped in pid 22.1 (tar) at/alpha/crtfa netbsd:cache_lookup+0xc0: lwz 0,32(31)
db> stbmatth
.c
gcat ufs_lookup+110
c-3.4.4/at VOP_LOOKUP+34
gcc/coat lookup+2f4
nfig/aat namei+10c
lpha/eat vn_open+90
lf.h
at sys_open+e0
at syscall_plain+14c
at setfault+c54
db>
(上の表示を整理すると)
gcc-3.4.4/gcc/config/alpha/alpha.h
gcc-3.4.4/gcc/config/alpha/alpha.md
gcc-3.4.4/gcc/config/alpha/crtfastmath.c
gcc-3.4.4/gcc/config/alpha/elf.h
trap type 300 at 3a5b34
Stopped in pid 22.1 (tar) at netbsd:cache_lookup+0xc0: lwz 0,32(31)
db>
また back trace は
db> bt
at ufs_lookup+110
at VOP_LOOKUP+34
at lookup+2f4
at namei+10c
at vn_open+90
at sys_open+e0
at syscall_plain+14c
at setfault+c54
register:
db> show registers
r0 0x59d80000
r1 0xe537abf0
r2 0
r3 0x39aae70
r4 0xe537ae88
r5 0xe537ae9c
r6 0
r7 0x1
r8 0x4ee8f70
r9 0x30
r10 0xc00c
r11 0xe0184000
r12 0x20004084
r13 0
r14 0x200
r15 0
r16 0
r17 0
r18 0
r19 0xe537acd8
r20 0
r21 0x20
r22 0x8
r23 0x200
r24 0x39aae70
r25 0xe537ae9c
r26 0xe537ae88
r27 0x39aae70
r28 0xe537ae9c
r29 0xe537ae9c
r30 0x39aae70
r31 0x6a980000
iar 0x3a5b34 cache_lookup+0xc0
msr 0x9032
lr 0x2f9b8c ufs_lookup+0x114
ctr 0x2fddc8 ufs_access
cr 0x20044084
xer 0x1
netbsd:cache_lookup+0xc0: lwz 0,32(31)
db>
- sys/kern/vfs_cache.c
の
inline cache_lookup_entry()
の中で落ちる
150: LIST_FOREACH(ncp, ncpp, nc_hash) {
151: if (ncp->nc_dvp == dvp &&
152: ncp->nc_nlen == cnp->cn_namelen &&
153: !memcmp(ncp->nc_name, cnp->cn_nameptr, (u_int)ncp->nc_nlen))
154: break;
155: }
この部分のコードは 2004/04/05 から変化がない
- cvs update, tar zxf などの操作中
- 落ちるのに 5 分もあれば充分
- trap type 300 (Data Storage Interrupt) または trap type 200 (Machine Check)
trap type 300 at 38f554
Stopped in pid 3873.1 (tar) at netbsd:cache_lookup+0x8c: lwz 0,32(31)
db> tlp0: receive ring overrun
trap type 200 at 38f91c
Stopped in pid 724.1 (cvs) at netbsd:cache_lookup_raw+0x8c: cmpw 7,30,0
db> tlp0: receive ring overrun
inline 展開されているので、落ちる場所はいくつかある
- (多分)主に落ちるコードは inline cache_lookup_entry
の中の(この例で言えば 0x003a6170 の)
次のところで、r31 が 0x6a980000 のような
困る値になっている
lwz 0,32(31)
上の objdump -d の例では (inline が解除されているので) r31 でなく r9 になっている
- これは
sys/sys/queue.h
の
163-166 行目の次の部分が展開された部分だと思われる
#define LIST_FOREACH(var, head, field) \
for ((var) = ((head)->lh_first); \
(var); \
(var) = ((var)->field.le_next))
このうちの最後の行だと思われる。この部分は 6 年くらい前から同じ。
- 今回調べているのは主として 4.99.3 と gcc 4.1.2 の組合せ
- vfs_cache.c を cc するのに
- -O2 を -O1 にすると、若干落ちにくくなるような気はするが 多分関係ない
- -O2 を -O0 または (何もなし)にすると、inline 展開がなくなるが、 それでも同じ
- gcc 3.4.6 で作って見たが、
同様に落ちる
- 機種は S-900, mini, 4400/200 など様々
- NIC は (殆んど) tlp0。でも gm0 (mini) もある
- 版は 3.99.21,
(tlp0)
4.99.1,
4.99.3 など
- ただし 3.99.21 は問題なく動いている機械もある(gm0)。4.99.3 は動いている機械がない。
(ここまで全て TsubaiBSD)
- NIC が関係ありそうな気がするので、 single user で NIC が動いていないはずの
状態で (local の) tar を開けて見るが、やはり
全く同様に落ちる
trap type 300 at 3a5b34
Stopped in pid 22.1 (tar) at netbsd:cache_lookup+0xc0: lwz 0,32(31)
db>
- kuro-hg (sandpoint/TNF) 4.99.3 は多分問題なく動いている(re0)
@
3.99.15 (20060101) では問題なし:
何と kernel だけ新しくしても問題ない .... (場合もある) ...
| kernel | (2006) |
|
| 3.99.15 | 3.99.17 | 3.99.19 | 3.99.20 | 3.99.21 | 4.99.1 | 4.99.3 |
userland ↓ |
| 04/08 | 05/06 | 05/27 | 6/05 | 6/16 | 6/25 | 6/28 | 07/02(2) | 07/02(UTC) | 8/22 | 10/08 |
3.99.15 | ○ | ○ |
|
|
|
|
|
|
|
|
| ○ |
3.99.17 | -- | ○ |
|
|
|
|
|
|
|
|
| × |
3.99.19 | -- | -- | ○ |
| ○ |
|
|
|
| × |
|
|
3.99.20 | -- | -- | -- | ○ | ○ | ○ | ○ | ○ | ○ | ×○(*1) |
|
|
3.99.21 | -- | -- | -- |
| -- |
|
|
|
|
|
|
|
4.99.3 | -- | -- | -- |
| -- |
|
|
|
|
|
| × |
(*1) ×は、以前に snapshot を作った時の kernel(GENERIC)。
○は、今回同じ src から作り直したもの。
L2-1M-PB2-SHM ではあるが、実は違うはずはない .. 速度的な違いがあるかも知れない。
念為×となっている方を再試したが、やはり× (GENERIC)。
GENERIC を作り直したが、○。ここは「作り直すと○」以前のものだと×。ということになっている。
(いま手元で使っている機械も、3.99.21 だけれど、問題ない ..)
ちなみに HAVE_GCC = 4 になったのは Jun 24, 2006 →
share/mk/bsd.own.mk
ただし要注意なことは(僕の作っている) TsubaiBSD の場合 snapshot の kernel を make して
いる cc は必ずしも、それと連動していない。
今気が付いた。make clean しないで make している。
今回新たに作っている kernel は全て gcc-4.1.2 による... と思ったが、
ここまでの感触は、gcc-34 (3.4.6) で作ると問題なし、gcc-4.1.2 だと
問題あり。