summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2011-03-23 16:38:29 +0000
committeralc <alc@FreeBSD.org>2011-03-23 16:38:29 +0000
commitc84b8f6e0c78ee33159cffed66726666e210f53a (patch)
treebf468389fa1d0f26006a2291890ed795a1f778b4
parent817bc23655881aacdc412c27eb48ce561b35ee46 (diff)
downloadFreeBSD-src-c84b8f6e0c78ee33159cffed66726666e210f53a.zip
FreeBSD-src-c84b8f6e0c78ee33159cffed66726666e210f53a.tar.gz
Modestly increase the maximum allowed size of the kmem map on i386.
Also, express this new maximum as a fraction of the kernel's address space size rather than a constant so that increasing KVA_PAGES will automatically increase this maximum. As a side-effect of this change, kern.maxvnodes will automatically increase by a proportional amount. While I'm here ensure that this change doesn't result in an unintended increase in maxpipekva on i386. Calculate maxpipekva based upon the size of the kernel address space and the amount of physical memory instead of the size of the kmem map. The memory backing pipes is not allocated from the kmem map. It is allocated from its own submap of the kernel map. In short, it has no real connection to the kmem map. (In fact, the commit messages for the maxpipekva auto-sizing talk about using the kernel map size, cf. r117325 and r117391, even though the implementation actually used the kmem map size.) Although the calculation is now done differently, the resulting value for maxpipekva should remain almost the same on i386. However, on amd64, the value will be reduced by 2/3. This is intentional. The recent change to VM_KMEM_SIZE_SCALE on amd64 for the benefit of ZFS also had the unnecessary side-effect of increasing maxpipekva. This change is effectively restoring maxpipekva on amd64 to its prior value. Eliminate init_param3() since it is no longer used.
-rw-r--r--sys/i386/include/vmparam.h3
-rw-r--r--sys/kern/kern_malloc.c5
-rw-r--r--sys/kern/subr_param.c19
-rw-r--r--sys/sys/systm.h1
4 files changed, 10 insertions, 18 deletions
diff --git a/sys/i386/include/vmparam.h b/sys/i386/include/vmparam.h
index e944810..9eaa3f7 100644
--- a/sys/i386/include/vmparam.h
+++ b/sys/i386/include/vmparam.h
@@ -189,7 +189,8 @@
* Ceiling on amount of kmem_map kva space.
*/
#ifndef VM_KMEM_SIZE_MAX
-#define VM_KMEM_SIZE_MAX (320 * 1024 * 1024)
+#define VM_KMEM_SIZE_MAX ((VM_MAX_KERNEL_ADDRESS - \
+ VM_MIN_KERNEL_ADDRESS) * 2 / 5)
#endif
/* initial pagein size of beginning of executable file */
diff --git a/sys/kern/kern_malloc.c b/sys/kern/kern_malloc.c
index a3a9795..7843cae 100644
--- a/sys/kern/kern_malloc.c
+++ b/sys/kern/kern_malloc.c
@@ -709,11 +709,6 @@ kmeminit(void *dummy)
if (((vm_kmem_size / 2) / PAGE_SIZE) > cnt.v_page_count)
vm_kmem_size = 2 * cnt.v_page_count * PAGE_SIZE;
- /*
- * Tune settings based on the kmem map's size at this time.
- */
- init_param3(vm_kmem_size / PAGE_SIZE);
-
#ifdef DEBUG_MEMGUARD
tmp = memguard_fudge(vm_kmem_size, vm_kmem_size_max);
#else
diff --git a/sys/kern/subr_param.c b/sys/kern/subr_param.c
index bf72a64..8c13336 100644
--- a/sys/kern/subr_param.c
+++ b/sys/kern/subr_param.c
@@ -48,7 +48,9 @@ __FBSDID("$FreeBSD$");
#include <sys/sysctl.h>
#include <sys/msgbuf.h>
+#include <vm/vm.h>
#include <vm/vm_param.h>
+#include <vm/pmap.h>
/*
* System parameter formulae.
@@ -293,22 +295,17 @@ init_param2(long physpages)
ncallout = 16 + maxproc + maxfiles;
TUNABLE_INT_FETCH("kern.ncallout", &ncallout);
-}
-
-/*
- * Boot time overrides that are scaled against the kmem map
- */
-void
-init_param3(long kmempages)
-{
/*
- * The default for maxpipekva is max(5% of the kmem map, 512KB).
- * See sys_pipe.c for more details.
+ * The default for maxpipekva is min(1/64 of the kernel address space,
+ * max(1/64 of main memory, 512KB)). See sys_pipe.c for more details.
*/
- maxpipekva = (kmempages / 20) * PAGE_SIZE;
+ maxpipekva = (physpages / 64) * PAGE_SIZE;
if (maxpipekva < 512 * 1024)
maxpipekva = 512 * 1024;
+ if (maxpipekva > (VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS) / 64)
+ maxpipekva = (VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS) /
+ 64;
TUNABLE_LONG_FETCH("kern.ipc.maxpipekva", &maxpipekva);
}
diff --git a/sys/sys/systm.h b/sys/sys/systm.h
index 39e9e8c..cd1f211 100644
--- a/sys/sys/systm.h
+++ b/sys/sys/systm.h
@@ -171,7 +171,6 @@ void critical_enter(void);
void critical_exit(void);
void init_param1(void);
void init_param2(long physpages);
-void init_param3(long kmempages);
void init_static_kenv(char *, size_t);
void tablefull(const char *);
int kvprintf(char const *, void (*)(int, void*), void *, int,
OpenPOWER on IntegriCloud