diff --git a/sys/kern/kern_subr.c b/sys/kern/kern_subr.c index 0c1d970493bb..c1912394176f 100644 --- a/sys/kern/kern_subr.c +++ b/sys/kern/kern_subr.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)kern_subr.c 8.3 (Berkeley) 1/21/94 - * $Id: kern_subr.c,v 1.3 1994/08/02 07:42:14 davidg Exp $ + * $Id: kern_subr.c,v 1.4 1995/02/12 09:11:47 davidg Exp $ */ #include @@ -90,6 +90,8 @@ uiomove(cp, n, uio) else bcopy(iov->iov_base, (caddr_t)cp, cnt); break; + case UIO_NOCOPY: + break; } iov->iov_base += cnt; iov->iov_len -= cnt; @@ -213,3 +215,36 @@ hashinit(elements, type, hashmask) *hashmask = hashsize - 1; return (hashtbl); } + +#define NPRIMES 24 +static int primes[] = { 61, 127, 251, 509, 761, 1021, 1531, 2039, 2557, + 3067, 3583, 4093, 4603, 5119, 5623, 6143, 6653, + 7159, 7673, 8191, 12281, 16381, 24571, 32749 }; + +/* + * General routine to allocate a prime number sized hash table. + */ +void * +phashinit(elements, type, nentries) + int elements, type; + u_long *nentries; +{ + long hashsize; + LIST_HEAD(generic, generic) *hashtbl; + int i; + + if (elements <= 0) + panic("hashinit: bad cnt"); + for (i = 1, hashsize = primes[1]; hashsize <= elements;) { + i++; + if (i == NPRIMES) + break; + hashsize = primes[i]; + } + hashsize = primes[i - 1]; + hashtbl = malloc((u_long)hashsize * sizeof(*hashtbl), type, M_WAITOK); + for (i = 0; i < hashsize; i++) + LIST_INIT(&hashtbl[i]); + *nentries = hashsize; + return (hashtbl); +} diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c index 8dc79db41710..bb4b8be16fee 100644 --- a/sys/kern/vfs_cache.c +++ b/sys/kern/vfs_cache.c @@ -33,7 +33,7 @@ * SUCH DAMAGE. * * @(#)vfs_cache.c 8.3 (Berkeley) 8/22/94 - * $Id: vfs_cache.c,v 1.11 1995/03/12 02:01:20 phk Exp $ + * $Id: vfs_cache.c,v 1.12 1995/03/19 09:33:51 davidg Exp $ */ #include @@ -72,7 +72,7 @@ */ LIST_HEAD(nchashhead, namecache) *nchashtbl; /* Hash Table */ TAILQ_HEAD(, namecache) nclruhead; /* LRU chain */ -u_long nchash; /* size of hash table - 1 */ +u_long nchash; /* size of hash table */ struct nchstats nchstats; /* cache effectiveness statistics */ struct vnode nchENOENT; /* our own "novnode" */ int doingcache = 1; /* 1 => enable the cache */ @@ -134,7 +134,7 @@ cache_lookup(dvp, vpp, cnp) return (0); } - ncpp = &nchashtbl[(dvp->v_id + cnp->cn_hash) & nchash]; + ncpp = &nchashtbl[(dvp->v_id + cnp->cn_hash) % nchash]; for (ncp = ncpp->lh_first; ncp != 0; ncp = nnp) { nnp = ncp->nc_hash.le_next; /* If one of the vp's went stale, don't bother anymore. */ @@ -235,7 +235,7 @@ cache_enter(dvp, vp, cnp) ncp->nc_nlen = cnp->cn_namelen; bcopy(cnp->cn_nameptr, ncp->nc_name, (unsigned)ncp->nc_nlen); TAILQ_INSERT_TAIL(&nclruhead, ncp, nc_lru); - ncpp = &nchashtbl[(dvp->v_id + cnp->cn_hash) & nchash]; + ncpp = &nchashtbl[(dvp->v_id + cnp->cn_hash) % nchash]; LIST_INSERT_HEAD(ncpp, ncp, nc_hash); } @@ -248,7 +248,7 @@ nchinit() { TAILQ_INIT(&nclruhead); - nchashtbl = hashinit(desiredvnodes, M_CACHE, &nchash); + nchashtbl = phashinit(desiredvnodes, M_CACHE, &nchash); nchENOENT.v_id = 1; }