summaryrefslogtreecommitdiff
path: root/sys/kern/vfs_subr.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/vfs_subr.c')
-rw-r--r--sys/kern/vfs_subr.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index eaa498009684..245adbc318d3 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -407,6 +407,27 @@ vnode_fini(void *mem, int size)
rw_destroy(BO_LOCKPTR(bo));
}
+/*
+ * Provide the size of NFS nclnode and NFS fh for calculation of the
+ * vnode memory consumption. The size is specified directly to
+ * eliminate dependency on NFS-private header.
+ *
+ * Other filesystems may use bigger or smaller (like UFS and ZFS)
+ * private inode data, but the NFS-based estimation is ample enough.
+ * Still, we care about differences in the size between 64- and 32-bit
+ * platforms.
+ *
+ * Namecache structure size is heuristically
+ * sizeof(struct namecache_ts) + CACHE_PATH_CUTOFF + 1.
+ */
+#ifdef _LP64
+#define NFS_NCLNODE_SZ (528 + 64)
+#define NC_SZ 148
+#else
+#define NFS_NCLNODE_SZ (360 + 32)
+#define NC_SZ 92
+#endif
+
static void
vntblinit(void *dummy __unused)
{
@@ -422,12 +443,12 @@ vntblinit(void *dummy __unused)
* marginal ratio of desiredvnodes to the physical memory size is
* 1:64. However, desiredvnodes is limited by the kernel's heap
* size. The memory required by desiredvnodes vnodes and vm objects
- * must not exceed 1/7th of the kernel's heap size.
+ * must not exceed 1/10th of the kernel's heap size.
*/
physvnodes = maxproc + pgtok(vm_cnt.v_page_count) / 64 +
3 * min(98304 * 16, pgtok(vm_cnt.v_page_count)) / 64;
- virtvnodes = vm_kmem_size / (7 * (sizeof(struct vm_object) +
- sizeof(struct vnode)));
+ virtvnodes = vm_kmem_size / (10 * (sizeof(struct vm_object) +
+ sizeof(struct vnode) + NC_SZ * ncsizefactor + NFS_NCLNODE_SZ));
desiredvnodes = min(physvnodes, virtvnodes);
if (desiredvnodes > MAXVNODES_MAX) {
if (bootverbose)