Author: mjg
Date: Thu Dec 29 08:41:25 2016
New Revision: 310767
URL: https://svnweb.freebsd.org/changeset/base/310767

Log:
  cache: depessimize hashing macros/inlines
  
  All hash sizes are power-of-2, but the compiler does not know that for sure
  and 'foo % size' forces doing a division.
  
  Store the size - 1 and use 'foo & hash' instead which allows mere shift.

Modified:
  head/sys/kern/vfs_cache.c

Modified: head/sys/kern/vfs_cache.c
==============================================================================
--- head/sys/kern/vfs_cache.c   Thu Dec 29 08:34:50 2016        (r310766)
+++ head/sys/kern/vfs_cache.c   Thu Dec 29 08:41:25 2016        (r310767)
@@ -242,26 +242,29 @@ static struct neglist ncneg_hot;
 
 static int     shrink_list_turn;
 
-static u_int   numneglists;
+#define        numneglists (ncneghash + 1)
+static u_int   ncneghash;
 static inline struct neglist *
 NCP2NEGLIST(struct namecache *ncp)
 {
 
-       return (&neglists[(((uintptr_t)(ncp) >> 8) % numneglists)]);
+       return (&neglists[(((uintptr_t)(ncp) >> 8) & ncneghash)]);
 }
 
-static u_int   numbucketlocks;
+#define        numbucketlocks (ncbuckethash + 1)
+static u_int   ncbuckethash;
 static struct rwlock_padalign  *bucketlocks;
 #define        HASH2BUCKETLOCK(hash) \
-       ((struct rwlock *)(&bucketlocks[((hash) % numbucketlocks)]))
+       ((struct rwlock *)(&bucketlocks[((hash) & ncbuckethash)]))
 
-static u_int   numvnodelocks;
+#define        numvnodelocks (ncvnodehash + 1)
+static u_int   ncvnodehash;
 static struct mtx *vnodelocks;
 static inline struct mtx *
 VP2VNODELOCK(struct vnode *vp)
 {
 
-       return (&vnodelocks[(((uintptr_t)(vp) >> 8) % numvnodelocks)]);
+       return (&vnodelocks[(((uintptr_t)(vp) >> 8) & ncvnodehash)]);
 }
 
 /*
@@ -1369,9 +1372,10 @@ cache_lock_vnodes_cel_3(struct celocksta
        cache_assert_vlp_locked(cel->vlp[0]);
        cache_assert_vlp_locked(cel->vlp[1]);
        MPASS(cel->vlp[2] == NULL);
-       MPASS(vp != NULL);
 
+       MPASS(vp != NULL);
        vlp = VP2VNODELOCK(vp);
+
        ret = true;
        if (vlp >= cel->vlp[1]) {
                mtx_lock(vlp);
@@ -1774,21 +1778,21 @@ nchinit(void *dummy __unused)
            NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_ZINIT);
 
        nchashtbl = hashinit(desiredvnodes * 2, M_VFSCACHE, &nchash);
-       numbucketlocks = cache_roundup_2(mp_ncpus * 64);
-       if (numbucketlocks > nchash + 1)
-               numbucketlocks = nchash + 1;
+       ncbuckethash = cache_roundup_2(mp_ncpus * 64) - 1;
+       if (ncbuckethash > nchash)
+               ncbuckethash = nchash;
        bucketlocks = malloc(sizeof(*bucketlocks) * numbucketlocks, M_VFSCACHE,
            M_WAITOK | M_ZERO);
        for (i = 0; i < numbucketlocks; i++)
                rw_init_flags(&bucketlocks[i], "ncbuc", RW_DUPOK | RW_RECURSE);
-       numvnodelocks = cache_roundup_2(mp_ncpus * 64);
+       ncvnodehash = cache_roundup_2(mp_ncpus * 64) - 1;
        vnodelocks = malloc(sizeof(*vnodelocks) * numvnodelocks, M_VFSCACHE,
            M_WAITOK | M_ZERO);
        for (i = 0; i < numvnodelocks; i++)
                mtx_init(&vnodelocks[i], "ncvn", NULL, MTX_DUPOK | MTX_RECURSE);
        ncpurgeminvnodes = numbucketlocks;
 
-       numneglists = 4;
+       ncneghash = 3;
        neglists = malloc(sizeof(*neglists) * numneglists, M_VFSCACHE,
            M_WAITOK | M_ZERO);
        for (i = 0; i < numneglists; i++) {
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to