Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 9 Oct 2009 22:58:57 GMT
From:      Gleb Kurtsou <gk@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 169353 for review
Message-ID:  <200910092258.n99MwvIe022374@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=169353

Change 169353 by gk@gk_h1 on 2009/10/09 22:58:02

	increase hash buckets umber to desiredvnodes/8
	use roundup2 instead of reimplementing it

Affected files ...

.. //depot/projects/soc2009/gk_pefs/sys/fs/pefs/pefs_crypto.c#14 edit
.. //depot/projects/soc2009/gk_pefs/sys/fs/pefs/pefs_subr.c#15 edit

Differences ...

==== //depot/projects/soc2009/gk_pefs/sys/fs/pefs/pefs_crypto.c#14 (text+ko) ====

@@ -50,7 +50,6 @@
 
 #define PEFS_CTR_BLOCK_SIZE		16
 #define PEFS_NAME_BLOCK_SIZE		16
-#define PEFS_BLOCK_ROUND(block, a)	(((a) + (block) - 1) & ~((block) - 1))
 
 CTASSERT(PEFS_KEY_SIZE <= SHA512_DIGEST_LENGTH);
 CTASSERT(PEFS_TWEAK_SIZE == 64/8);
@@ -448,7 +447,7 @@
 	MPASS(size > PEFS_NAME_CSUM_SIZE && size <= MAXNAMLEN);
 	psize = size - PEFS_NAME_CSUM_SIZE;
 	psize = PEFS_NAME_CSUM_SIZE +
-	    PEFS_BLOCK_ROUND(PEFS_NAME_BLOCK_SIZE, psize);
+	    roundup2(psize, PEFS_NAME_BLOCK_SIZE);
 
 	return (psize);
 }

==== //depot/projects/soc2009/gk_pefs/sys/fs/pefs/pefs_subr.c#15 (text+ko) ====

@@ -70,26 +70,15 @@
 #include <sys/dirent.h>
 #include <sys/queue.h>
 #include <sys/proc.h>
+#include <sys/sysctl.h>
 #include <sys/uio.h>
 #include <sys/taskqueue.h>
 #include <sys/vnode.h>
 
 #include <fs/pefs/pefs.h>
 
-#define LOG2_SIZEVNODE 8		/* log2(sizeof struct vnode) */
-#define	NPENODECACHE 16
-
-/*
- * Null layer cache:
- * Each cache entry holds a reference to the lower vnode
- * along with a pointer to the alias vnode.  When an
- * entry is added the lower vnode is VREF'd.  When the
- * alias is removed the lower vnode is vrele'd.
- */
+static SYSCTL_NODE(_vfs, OID_AUTO, pefs, CTLFLAG_RW, 0, "PEFS filesystem");
 
-#define	PEFS_NHASH(vp) \
-	(&pefs_node_hashtbl[(((uintptr_t)vp)>>LOG2_SIZEVNODE) & pefs_node_hash])
-
 typedef int (pefs_node_init_fn)(struct mount *mp, struct pefs_node *pn,
     void *context);
 LIST_HEAD(pefs_node_listhead, pefs_node);
@@ -103,13 +92,17 @@
 
 static struct pefs_node_listhead pefs_node_freelist;
 static struct pefs_node_listhead *pefs_node_hashtbl;
-static u_long pefs_node_hash;
+static u_long pefs_node_hashmask;
 
 static MALLOC_DEFINE(M_PEFSHASH, "pefs_hash", "PEFS hash table");
 MALLOC_DEFINE(M_PEFSBUF, "pefs_buf", "PEFS buffers");
 
 static uma_zone_t pefs_node_zone;
 
+static u_int pefs_nodes;
+SYSCTL_UINT(_vfs_pefs, OID_AUTO, nodes, CTLFLAG_RD, &pefs_nodes, 0,
+    "Allocated nodes");
+
 /*
  * Initialise cache headers
  */
@@ -128,9 +121,13 @@
 	pefs_node_zone = uma_zcreate("pefs_node", sizeof(struct pefs_node),
 	    NULL, NULL, NULL, (uma_fini) bzero, UMA_ALIGN_PTR, 0);
 
-	pefs_node_hashtbl = hashinit(NPENODECACHE, M_PEFSHASH, &pefs_node_hash);
+	pefs_node_hashtbl = hashinit(desiredvnodes / 8, M_PEFSHASH,
+	    &pefs_node_hashmask);
+	pefs_nodes = 0;
 	mtx_init(&pefs_node_listmtx, "pefs_node_list", NULL, MTX_DEF);
+
 	pefs_crypto_init();
+
 	return (0);
 }
 
@@ -147,6 +144,21 @@
 	return (0);
 }
 
+static inline struct pefs_node_listhead *
+pefs_node_hashlookup(struct vnode *vp)
+{
+	uintptr_t v = (uintptr_t)vp;
+
+	v = (~v) + (v << 18);
+	v = v ^ (v >> 31);
+	v = v * 21;
+	v = v ^ (v >> 11);
+	v = v + (v << 6);
+	v = v ^ (v >> 22);
+
+	return (&pefs_node_hashtbl[v & pefs_node_hashmask]);
+}
+
 /*
  * Return a VREF'ed alias for lower vnode if already exists, else 0.
  * Lower vnode should be locked on entry and will be left locked on exit.
@@ -166,7 +178,7 @@
 	 * the lower vnode.  If found, the increment the pefs_node
 	 * reference count (but NOT the lower vnode's VREF counter).
 	 */
-	hd = PEFS_NHASH(lowervp);
+	hd = pefs_node_hashlookup(lowervp);
 	mtx_lock(&pefs_node_listmtx);
 	LIST_FOREACH(a, hd, pn_listentry) {
 		if (a->pn_lowervp == lowervp && PN_TO_VP(a)->v_mount == mp) {
@@ -197,7 +209,7 @@
 	struct pefs_node *oxp;
 	struct vnode *ovp;
 
-	hd = PEFS_NHASH(pn->pn_lowervp);
+	hd = pefs_node_hashlookup(pn->pn_lowervp);
 	mtx_lock(&pefs_node_listmtx);
 	LIST_FOREACH(oxp, hd, pn_listentry) {
 		if (oxp->pn_lowervp == pn->pn_lowervp &&
@@ -212,6 +224,7 @@
 			return (ovp);
 		}
 	}
+	pefs_nodes++;
 	LIST_INSERT_HEAD(hd, pn, pn_listentry);
 	mtx_unlock(&pefs_node_listmtx);
 	return (NULLVP);
@@ -500,6 +513,7 @@
 	PEFSDEBUG("pefs_node_asyncfree: free node %p\n", pn);
 	pefs_key_release(pn->pn_tkey.ptk_key);
 	mtx_lock(&pefs_node_listmtx);
+	pefs_nodes--;
 	LIST_REMOVE(pn, pn_listentry);
 	LIST_INSERT_HEAD(&pefs_node_freelist, pn, pn_listentry);
 	mtx_unlock(&pefs_node_listmtx);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200910092258.n99MwvIe022374>