|
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 ← MAKEENTRYsys/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 からずうっと使われている部分か .. 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 か。 |
最近の日記 | ||