Author: mjg
Date: Fri Sep  8 06:51:33 2017
New Revision: 323307
URL: https://svnweb.freebsd.org/changeset/base/323307

Log:
  namecache: factor out dot lookup into a dedicated function
  
  The intent is to move uncommon cases out of the way.
  
  MFC after:    1 week

Modified:
  head/sys/kern/vfs_cache.c

Modified: head/sys/kern/vfs_cache.c
==============================================================================
--- head/sys/kern/vfs_cache.c   Fri Sep  8 06:46:24 2017        (r323306)
+++ head/sys/kern/vfs_cache.c   Fri Sep  8 06:51:33 2017        (r323307)
@@ -1073,6 +1073,42 @@ cache_lookup_unlock(struct rwlock *blp, struct mtx *vl
        }
 }
 
+static int __noinline
+cache_lookup_dot(struct vnode *dvp, struct vnode **vpp, struct componentname 
*cnp,
+    struct timespec *tsp, int *ticksp)
+{
+       int ltype;
+
+       *vpp = dvp;
+       CTR2(KTR_VFS, "cache_lookup(%p, %s) found via .",
+                       dvp, cnp->cn_nameptr);
+       counter_u64_add(dothits, 1);
+       SDT_PROBE3(vfs, namecache, lookup, hit, dvp, ".", *vpp);
+       if (tsp != NULL)
+               timespecclear(tsp);
+       if (ticksp != NULL)
+               *ticksp = ticks;
+       vrefact(*vpp);
+       /*
+        * When we lookup "." we still can be asked to lock it
+        * differently...
+        */
+       ltype = cnp->cn_lkflags & LK_TYPE_MASK;
+       if (ltype != VOP_ISLOCKED(*vpp)) {
+               if (ltype == LK_EXCLUSIVE) {
+                       vn_lock(*vpp, LK_UPGRADE | LK_RETRY);
+                       if ((*vpp)->v_iflag & VI_DOOMED) {
+                               /* forced unmount */
+                               vrele(*vpp);
+                               *vpp = NULL;
+                               return (ENOENT);
+                       }
+               } else
+                       vn_lock(*vpp, LK_DOWNGRADE | LK_RETRY);
+       }
+       return (-1);
+}
+
 /*
  * Lookup an entry in the cache
  *
@@ -1111,36 +1147,8 @@ retry:
        counter_u64_add(numcalls, 1);
 
        if (cnp->cn_nameptr[0] == '.') {
-               if (cnp->cn_namelen == 1) {
-                       *vpp = dvp;
-                       CTR2(KTR_VFS, "cache_lookup(%p, %s) found via .",
-                           dvp, cnp->cn_nameptr);
-                       counter_u64_add(dothits, 1);
-                       SDT_PROBE3(vfs, namecache, lookup, hit, dvp, ".", *vpp);
-                       if (tsp != NULL)
-                               timespecclear(tsp);
-                       if (ticksp != NULL)
-                               *ticksp = ticks;
-                       vrefact(*vpp);
-                       /*
-                        * When we lookup "." we still can be asked to lock it
-                        * differently...
-                        */
-                       ltype = cnp->cn_lkflags & LK_TYPE_MASK;
-                       if (ltype != VOP_ISLOCKED(*vpp)) {
-                               if (ltype == LK_EXCLUSIVE) {
-                                       vn_lock(*vpp, LK_UPGRADE | LK_RETRY);
-                                       if ((*vpp)->v_iflag & VI_DOOMED) {
-                                               /* forced unmount */
-                                               vrele(*vpp);
-                                               *vpp = NULL;
-                                               return (ENOENT);
-                                       }
-                               } else
-                                       vn_lock(*vpp, LK_DOWNGRADE | LK_RETRY);
-                       }
-                       return (-1);
-               }
+               if (cnp->cn_namelen == 1)
+                       return (cache_lookup_dot(dvp, vpp, cnp, tsp, ticksp));
                if (cnp->cn_namelen == 2 && cnp->cn_nameptr[1] == '.') {
                        counter_u64_add(dotdothits, 1);
                        dvlp2 = NULL;
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to