The desiredvnodes variable is terribly named and used inconsistently.
First, rename it to initialvnodes. This isn't perfect, but it's a
little better I think.
Second, the ufs hash table can and probably should be initialvnodes in
size, but there's no reason why ntfs and isofs need to be that big. I
think initialvnodes / 4 is a reasonable number. Just a guess.
Index: conf/param.c
===================================================================
RCS file: /cvs/src/sys/conf/param.c,v
retrieving revision 1.34
diff -u -p -r1.34 param.c
--- conf/param.c 10 Apr 2012 15:50:52 -0000 1.34
+++ conf/param.c 8 Jan 2015 18:22:59 -0000
@@ -85,7 +85,7 @@ struct timezone tz = { TIMEZONE, DST };
#define NPROCESS (30 + 16 * MAXUSERS)
#define NTEXT (80 + NPROCESS / 8) /* actually the object
cache */
#define NVNODE (NPROCESS * 2 + NTEXT + 100)
-int desiredvnodes = NVNODE;
+int initialvnodes = NVNODE;
int maxprocess = NPROCESS;
int maxthread = NPROCESS + 8 * MAXUSERS;
int maxfiles = 5 * (NPROCESS + MAXUSERS) + 80;
Index: isofs/cd9660/cd9660_node.c
===================================================================
RCS file: /cvs/src/sys/isofs/cd9660/cd9660_node.c,v
retrieving revision 1.27
diff -u -p -r1.27 cd9660_node.c
--- isofs/cd9660/cd9660_node.c 16 Dec 2014 18:30:03 -0000 1.27
+++ isofs/cd9660/cd9660_node.c 8 Jan 2015 18:22:59 -0000
@@ -78,7 +78,7 @@ cd9660_init(vfsp)
struct vfsconf *vfsp;
{
- isohashtbl = hashinit(desiredvnodes, M_ISOFSMNT, M_WAITOK, &isohash);
+ isohashtbl = hashinit(initialvnodes / 4, M_ISOFSMNT, M_WAITOK,
&isohash);
arc4random_buf(&isohashkey, sizeof(isohashkey));
return (0);
}
Index: kern/vfs_cache.c
===================================================================
RCS file: /cvs/src/sys/kern/vfs_cache.c,v
retrieving revision 1.41
diff -u -p -r1.41 vfs_cache.c
--- kern/vfs_cache.c 8 Jan 2015 18:07:35 -0000 1.41
+++ kern/vfs_cache.c 8 Jan 2015 18:22:59 -0000
@@ -400,7 +400,7 @@ cache_enter(struct vnode *dvp, struct vn
TAILQ_INSERT_TAIL(&nclruneghead, ncp, nc_neg);
numneg++;
}
- if (numneg > desiredvnodes) {
+ if (numneg > initialvnodes) {
if ((ncp = TAILQ_FIRST(&nclruneghead))
!= NULL)
cache_zap(ncp);
Index: kern/vfs_subr.c
===================================================================
RCS file: /cvs/src/sys/kern/vfs_subr.c,v
retrieving revision 1.227
diff -u -p -r1.227 vfs_subr.c
--- kern/vfs_subr.c 19 Dec 2014 05:59:21 -0000 1.227
+++ kern/vfs_subr.c 8 Jan 2015 18:23:00 -0000
@@ -142,7 +142,7 @@ void
vntblinit(void)
{
/* buffer cache may need a vnode for each buffer */
- maxvnodes = 2 * desiredvnodes;
+ maxvnodes = 2 * initialvnodes;
pool_init(&vnode_pool, sizeof(struct vnode), 0, 0, PR_WAITOK,
"vnodes", NULL);
pool_init(&uvm_vnode_pool, sizeof(struct uvm_vnode), 0, 0, PR_WAITOK,
Index: msdosfs/msdosfs_denode.c
===================================================================
RCS file: /cvs/src/sys/msdosfs/msdosfs_denode.c,v
retrieving revision 1.52
diff -u -p -r1.52 msdosfs_denode.c
--- msdosfs/msdosfs_denode.c 16 Dec 2014 18:30:04 -0000 1.52
+++ msdosfs/msdosfs_denode.c 8 Jan 2015 18:23:00 -0000
@@ -82,7 +82,7 @@ static void msdosfs_hashrem(struct denod
int
msdosfs_init(struct vfsconf *vfsp)
{
- dehashtbl = hashinit(desiredvnodes/2, M_MSDOSFSMNT, M_WAITOK, &dehash);
+ dehashtbl = hashinit(initialvnodes / 4, M_MSDOSFSMNT, M_WAITOK,
&dehash);
arc4random_buf(&dehashkey, sizeof(dehashkey));
return (0);
}
Index: ntfs/ntfs_ihash.c
===================================================================
RCS file: /cvs/src/sys/ntfs/ntfs_ihash.c,v
retrieving revision 1.17
diff -u -p -r1.17 ntfs_ihash.c
--- ntfs/ntfs_ihash.c 18 Nov 2014 10:42:15 -0000 1.17
+++ ntfs/ntfs_ihash.c 8 Jan 2015 18:23:00 -0000
@@ -69,7 +69,7 @@ ntfs_nthashinit(void)
if (ntfs_nthashtbl)
return;
- nthashtbl = hashinit(desiredvnodes, M_NTFSNTHASH, M_WAITOK, &nthash);
+ nthashtbl = hashinit(initialvnodes / 4, M_NTFSNTHASH, M_WAITOK,
&nthash);
if (ntfs_nthashtbl) {
free(nthashtbl, M_NTFSNTHASH, 0);
return;
Index: sys/vnode.h
===================================================================
RCS file: /cvs/src/sys/sys/vnode.h,v
retrieving revision 1.128
diff -u -p -r1.128 vnode.h
--- sys/vnode.h 16 Dec 2014 18:30:04 -0000 1.128
+++ sys/vnode.h 8 Jan 2015 18:23:00 -0000
@@ -242,7 +242,7 @@ extern struct freelst vnode_free_list; /
* Global vnode data.
*/
extern struct vnode *rootvnode; /* root (i.e. "/") vnode */
-extern int desiredvnodes; /* XXX number of vnodes desired */
+extern int initialvnodes; /* XXX number of vnodes to start */
extern int maxvnodes; /* XXX number of vnodes to allocate */
extern int syncdelay; /* seconds to delay syncing vnodes */
extern int rushjob; /* # of slots syncer should run ASAP */
Index: ufs/ffs/ffs_softdep.c
===================================================================
RCS file: /cvs/src/sys/ufs/ffs/ffs_softdep.c,v
retrieving revision 1.130
diff -u -p -r1.130 ffs_softdep.c
--- ufs/ffs/ffs_softdep.c 23 Dec 2014 01:53:34 -0000 1.130
+++ ufs/ffs/ffs_softdep.c 8 Jan 2015 18:23:01 -0000
@@ -1160,16 +1160,16 @@ softdep_initialize(void)
LIST_INIT(&mkdirlisthd);
LIST_INIT(&softdep_workitem_pending);
#ifdef KMEMSTATS
- max_softdeps = min (desiredvnodes * 8,
+ max_softdeps = min (initialvnodes * 8,
kmemstats[M_INODEDEP].ks_limit / (2 * sizeof(struct inodedep)));
#else
- max_softdeps = desiredvnodes * 4;
+ max_softdeps = initialvnodes * 4;
#endif
arc4random_buf(&softdep_hashkey, sizeof(softdep_hashkey));
- pagedep_hashtbl = hashinit(desiredvnodes / 5, M_PAGEDEP, M_WAITOK,
+ pagedep_hashtbl = hashinit(initialvnodes / 5, M_PAGEDEP, M_WAITOK,
&pagedep_hash);
sema_init(&pagedep_in_progress, "pagedep", PRIBIO, 0);
- inodedep_hashtbl = hashinit(desiredvnodes, M_INODEDEP, M_WAITOK,
+ inodedep_hashtbl = hashinit(initialvnodes, M_INODEDEP, M_WAITOK,
&inodedep_hash);
sema_init(&inodedep_in_progress, "inodedep", PRIBIO, 0);
newblk_hashtbl = hashinit(64, M_NEWBLK, M_WAITOK, &newblk_hash);
Index: ufs/ufs/ufs_ihash.c
===================================================================
RCS file: /cvs/src/sys/ufs/ufs/ufs_ihash.c,v
retrieving revision 1.20
diff -u -p -r1.20 ufs_ihash.c
--- ufs/ufs/ufs_ihash.c 17 Nov 2014 00:59:31 -0000 1.20
+++ ufs/ufs/ufs_ihash.c 8 Jan 2015 18:23:01 -0000
@@ -72,7 +72,7 @@ ufs_ihash(dev_t dev, ufsino_t inum)
void
ufs_ihashinit(void)
{
- ihashtbl = hashinit(desiredvnodes, M_UFSMNT, M_WAITOK, &ihash);
+ ihashtbl = hashinit(initialvnodes, M_UFSMNT, M_WAITOK, &ihash);
arc4random_buf(&ihashkey, sizeof(ihashkey));
}
Index: ufs/ufs/ufs_quota.c
===================================================================
RCS file: /cvs/src/sys/ufs/ufs/ufs_quota.c,v
retrieving revision 1.36
diff -u -p -r1.36 ufs_quota.c
--- ufs/ufs/ufs_quota.c 18 Nov 2014 10:42:15 -0000 1.36
+++ ufs/ufs/ufs_quota.c 8 Jan 2015 18:23:01 -0000
@@ -824,7 +824,7 @@ long numdquot, desireddquot = DQUOTINC;
void
ufs_quota_init(void)
{
- dqhashtbl = hashinit(desiredvnodes, M_DQUOT, M_WAITOK, &dqhash);
+ dqhashtbl = hashinit(initialvnodes / 4, M_DQUOT, M_WAITOK, &dqhash);
arc4random_buf(&dqhashkey, sizeof(dqhashkey));
TAILQ_INIT(&dqfreelist);
}
@@ -877,7 +877,7 @@ dqget(struct vnode *vp, u_long id, struc
* Not in cache, allocate a new one.
*/
if (TAILQ_FIRST(&dqfreelist) == NODQUOT &&
- numdquot < MAXQUOTAS * desiredvnodes)
+ numdquot < MAXQUOTAS * initialvnodes / 4)
desireddquot += DQUOTINC;
if (numdquot < desireddquot) {
dq = malloc(sizeof *dq, M_DQUOT, M_WAITOK | M_ZERO);