PERFORCE change 169353 for review
Gleb Kurtsou
gk at FreeBSD.org
Fri Oct 9 22:58:58 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=169353
Change 169353 by gk at 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);
More information about the p4-projects
mailing list