kernel - rework struct nchstats for systat
authorMatthew Dillon <dillon@apollo.backplane.com>
Tue, 16 Mar 2010 19:15:54 +0000 (12:15 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Tue, 16 Mar 2010 19:15:54 +0000 (12:15 -0700)
* Remove ncs_long, ncs_pass2 and ncs_2passes and replace with
  ncs_longhits, ncs_longmiss, and ncs_unused (so the structure
  size does not change).

  The new longhits/longmiss statistics are for whole path
  lookups.

sys/kern/vfs_nlookup.c
sys/sys/nchstats.h
sys/vfs/gnu/ext2fs/ext2_lookup.c
sys/vfs/isofs/cd9660/cd9660_lookup.c
sys/vfs/udf/udf_vnops.c
sys/vfs/ufs/ufs_lookup.c

index 9d9f22e..ab7df39 100644 (file)
@@ -408,6 +408,7 @@ nlookup_simple(const char *str, enum uio_seg seg,
 int
 nlookup(struct nlookupdata *nd)
 {
+    globaldata_t gd = mycpu;
     struct nlcomponent nlc;
     struct nchandle nch;
     struct nchandle par;
@@ -419,6 +420,7 @@ nlookup(struct nlookupdata *nd)
     int error;
     int len;
     int dflags;
+    int hit = 1;
 
 #ifdef KTRACE
     if (KTRPOINT(nd->nl_td, KTR_NAMEI))
@@ -559,6 +561,8 @@ nlookup(struct nlookupdata *nd)
            cache_unlock(&nd->nl_nch);
            nd->nl_flags &= ~NLC_NCPISLOCKED;
            nch = cache_nlookup(&nd->nl_nch, &nlc);
+           if (nch.ncp->nc_flag & NCF_UNRESOLVED)
+               hit = 0;
            while ((error = cache_resolve(&nch, nd->nl_cred)) == EAGAIN) {
                kprintf("[diagnostic] nlookup: relookup %*.*s\n", 
                        nch.ncp->nc_nlen, nch.ncp->nc_nlen, nch.ncp->nc_name);
@@ -608,6 +612,7 @@ nlookup(struct nlookupdata *nd)
         * previously resolved and thus cannot be newly created ncp's.
         */
        if (nch.ncp->nc_flag & NCF_UNRESOLVED) {
+           hit = 0;
            error = cache_resolve(&nch, nd->nl_cred);
            KKASSERT(error != EAGAIN);
        } else {
@@ -814,6 +819,11 @@ nlookup(struct nlookupdata *nd)
        break;
     }
 
+    if (hit)
+           ++gd->gd_nchstats->ncs_longhits;
+    else
+           ++gd->gd_nchstats->ncs_longmiss;
+
     /*
      * NOTE: If NLC_CREATE was set the ncp may represent a negative hit
      * (ncp->nc_error will be ENOENT), but we will still return an error
index 45770bd..d77d34a 100644 (file)
@@ -46,9 +46,9 @@ struct        nchstats {
        unsigned long   ncs_badhits;    /* hits we must drop */
        unsigned long   ncs_falsehits;  /* hits with id mismatch */
        unsigned long   ncs_miss;       /* misses */
-       unsigned long   ncs_long;       /* long names that ignore cache */
-       unsigned long   ncs_pass2;      /* names found with passes == 2 */
-       unsigned long   ncs_2passes;    /* number of times we attempt it */
+       unsigned long   ncs_longhits;   /* path lookup hits */
+       unsigned long   ncs_longmiss;   /* path lookup misses */
+       unsigned long   ncs_unused;     /* number of times we attempt it */
 };
 
 #endif /* _SYS_NCHSTATS_H_ */
index 48fa130..ee2df36 100644 (file)
@@ -311,7 +311,6 @@ ext2_lookup(struct vop_old_lookup_args *ap)
        struct ucred *cred = cnp->cn_cred;
        int flags = cnp->cn_flags;
        int nameiop = cnp->cn_nameiop;
-       globaldata_t gd = mycpu;
 
        int     DIRBLKSIZ = VTOI(ap->a_dvp)->i_e2fs->s_blocksize;
 
@@ -366,7 +365,6 @@ ext2_lookup(struct vop_old_lookup_args *ap)
                    (error = EXT2_BLKATOFF(vdp, (off_t)dp->i_offset, NULL, &bp)))
                        return (error);
                numdirpasses = 2;
-               gd->gd_nchstats->ncs_2passes++;
        }
        prevoff = dp->i_offset;
        endsearch = roundup(dp->i_size, DIRBLKSIZ);
@@ -533,8 +531,6 @@ searchloop:
        return (ENOENT);
 
 found:
-       if (numdirpasses == 2)
-               gd->gd_nchstats->ncs_pass2++;
        /*
         * Check that directory length properly reflects presence
         * of this entry.
index e3c5553..d758658 100644 (file)
@@ -93,7 +93,6 @@ int
 cd9660_lookup(struct vop_old_lookup_args *ap)
 {
        struct vnode *vdp;      /* vnode for directory being searched */
-       globaldata_t gd = mycpu;
        struct iso_node *dp;    /* inode for directory being searched */
        struct iso_mnt *imp;    /* file system that directory is in */
        struct buf *bp;                 /* a buffer of directory entries */
@@ -168,7 +167,6 @@ cd9660_lookup(struct vop_old_lookup_args *ap)
                    (error = cd9660_devblkatoff(vdp, (off_t)dp->i_offset, NULL, &bp)))
                                return (error);
                numdirpasses = 2;
-               gd->gd_nchstats->ncs_2passes++;
        }
        endsearch = dp->i_size;
        
@@ -315,9 +313,6 @@ notfound:
        return (ENOENT);
 
 found:
-       if (numdirpasses == 2)
-               gd->gd_nchstats->ncs_pass2++;
-       
        /*
         * Found component in pathname.
         * If the final component of path name, save information
index 79696cc..57c6ec4 100644 (file)
@@ -908,7 +908,6 @@ udf_lookup(struct vop_old_lookup_args *a)
        } else {
                offset = node->diroff;
                numdirpasses = 2;
-               gd->gd_nchstats->ncs_2passes++;
        }
 
 lookloop:
@@ -959,8 +958,6 @@ lookloop:
                         */
                        if (nameiop == NAMEI_LOOKUP)
                                node->diroff = ds->offset + ds->off;
-                       if (numdirpasses == 2)
-                               gd->gd_nchstats->ncs_pass2++;
                        if ((flags & CNP_LOCKPARENT) == 0) {
                                a->a_cnp->cn_flags |= CNP_PDIRUNLOCK;
                                vn_unlock(dvp);
index 22fc72a..9f1c571 100644 (file)
@@ -138,7 +138,6 @@ ufs_lookup(struct vop_old_lookup_args *ap)
        struct ucred *cred = cnp->cn_cred;
        int flags = cnp->cn_flags;
        int nameiop = cnp->cn_nameiop;
-       globaldata_t gd = mycpu;
 
        bp = NULL;
        slotoffset = -1;
@@ -230,7 +229,6 @@ ufs_lookup(struct vop_old_lookup_args *ap)
                    (error = ffs_blkatoff(vdp, (off_t)dp->i_offset, NULL, &bp)))
                        return (error);
                numdirpasses = 2;
-               gd->gd_nchstats->ncs_2passes++;
        }
        prevoff = dp->i_offset;
        endsearch = roundup2(dp->i_size, DIRBLKSIZ);
@@ -433,8 +431,6 @@ notfound:
        return (ENOENT);
 
 found:
-       if (numdirpasses == 2)
-               gd->gd_nchstats->ncs_pass2++;
        /*
         * Check that directory length properly reflects presence
         * of this entry.