通常日記 | 分類別 ABC 順 | 北目式分類 | macppc/ | port-macppc 全文検索 | NetBSD (old) | NetBSD 解説 | PHP+Postgresql | PowerMac7220/4400 雑記帳 | 4400/200

NetBSD/macppc StarMax 専用

macppc の中でも Tanzania 板を使っているものは少し特殊なので、 それに限った記録はこちらに書きます。
(Motorola StarMax, PowerMac 4400 など)
hns - 日記自動生成システム - Version 2.19.9

先月 2006年10月 来月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Namazu for hns による簡易全文検索
詳しくは 詳細指定/ヘルプを参照して下さい
検索式:

2006年10月20日(金) [n年日記] Last Update: "2006/12/12 23:32:01"

#1 [kernel] cache_lookup

9/28 に書いたこと がどうもおかしいので、もう一度見ているが、inline を見落していた。 まず、cc に -S を付けて vfs_cache.s を作って見る。それには、
cd src/sys/arch/macppc/compile/GENERIC
sudo rm vfs_cache.o
make
として、cc の行を表示させる。その上で、同じ操作に -S を加える。 これで出来た vfs_cache.s を見ている。
    193         cmpwi 7,9,0
    194         beq- 7,.L71 
    195         lwz 29,24(5)
    196         cmpwi 7,29,31
    197         bgt- 7,.L72 
    198         lwz 10,28(5)
    199         lis 11,nchash@ha
    200         lwz 0,nchash@l(11)
    201         srwi 9,3,3  
    202         xor 9,9,10
    203         lis 11,nchashtbl@ha
    204         and 9,9,0
    205         lwz 10,nchashtbl@l(11)
    206         slwi 9,9,2
    207         lwzx 31,9,10
    208         cmpwi 7,31,0
    209         bne+ 7,.L69 
    210         b .L32
    211 .L34:   
    212         lwz 31,0(31)
    213         cmpwi 7,31,0
    214         beq- 7,.L32
    215 .L69:
    216         lwz 0,32(31)
    217         cmpw 7,30,0
    218         bne+ 7,.L34
    219         lbz 0,52(31)
    220         cmpw 7,29,0
    221         bne+ 7,.L34
    222         lwz 4,20(28)
    223         addi 3,31,53
    224         mr 5,29
    225         bl memcmp
    226         cmpwi 0,3,0
    227         bne+ 0,.L34     
    228         lwz 11,4(28)
    229         andi. 0,11,16384     ← MAKEENTRY
sys/kern/vfs_cache.c の次の部分は
   194          simple_lock(&namecache_slock);
   195          ncp = cache_lookup_entry(dvp, cnp);
同じ中の次の部分が展開される
    139 static inline struct namecache *
    140 cache_lookup_entry(const struct vnode *dvp, const struct componentname *cnp)
    141 {
    142         struct nchashhead *ncpp;
    143         struct namecache *ncp;
    144  
    145         LOCK_ASSERT(simple_lock_held(&namecache_slock));
    146
    147         ncpp = &nchashtbl[NCHASH(cnp, dvp)];   // 上にある通り hash head を得る
    148  
    149         LIST_FOREACH(ncp, ncpp, nc_hash) {     // var, head, field
    150                 if (ncp->nc_dvp == dvp &&
    151                     ncp->nc_nlen == cnp->cn_namelen &&
    152                     !memcmp(ncp->nc_name, cnp->cn_nameptr, (u_int)ncp->nc_nlen))
    153                         break;  
    154         }
    155
    156         return ncp;
    157 }
この 150 行目の、
ncp->nc_dvp
の部分ではないかなと思えて来た。 この辺は version 1.55, 2004/04/05 10:20:52 からずうっと使われている部分か ..

src/sys/sys/namei.h より:

    162 struct  namecache {
    163         LIST_ENTRY(namecache) nc_hash;  /* hash chain */
    164         TAILQ_ENTRY(namecache) nc_lru;  /* LRU chain */
    165         LIST_ENTRY(namecache) nc_vhash; /* directory hash chain */
    166         LIST_ENTRY(namecache) nc_dvlist;
    167         struct  vnode *nc_dvp;          /* vnode of parent of name */
    168         LIST_ENTRY(namecache) nc_vlist;
    169         struct  vnode *nc_vp;           /* vnode the name refers to */
    170         int     nc_flags;               /* copy of componentname's ISWHITEOUT */
    171         char    nc_nlen;                /* length of name */
    172         char    nc_name[NCHNAMLEN];     /* segment name */
    173 };      
「この名前の親の vnode を見に行くと問題が起きる」 .. 訳がないか .. ncp って、どこで初期化しているのか分らない ..

src/sys/sys/queue.h も見ておく必要があるのかな:

    162 #define LIST_FOREACH(var, head, field)                                  \
    163         for ((var) = ((head)->lh_first);                                \
    164                 (var);                                                  \
    165                 (var) = ((var)->field.le_next))
そうか for の変数が ncp か。


最近の日記
以上、1 日分です。
タイトル一覧
カテゴリ分類
Powered by hns-2.19.9, HyperNikkiSystem Project

Count.cgi (since 2000/03/03)