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>