summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorian <ian@FreeBSD.org>2014-05-16 01:30:30 +0000
committerian <ian@FreeBSD.org>2014-05-16 01:30:30 +0000
commit8e2dd9b5e30117e2cab1d46c1cc0c2dfb4b7647e (patch)
tree35fa7519fc913330e83ec8d0a5549451f541f2e2 /sys
parente58449eb7bc00b546bc709cb6348a17b98b8e5e6 (diff)
downloadFreeBSD-src-8e2dd9b5e30117e2cab1d46c1cc0c2dfb4b7647e.zip
FreeBSD-src-8e2dd9b5e30117e2cab1d46c1cc0c2dfb4b7647e.tar.gz
MFC r257854 (discussed with alc@)
As of r257209, all architectures have defined VM_KMEM_SIZE_SCALE. In other words, every architecture is now auto-sizing the kmem arena. This revision changes kmeminit() so that the definition of VM_KMEM_SIZE_SCALE becomes mandatory and the definition of VM_KMEM_SIZE becomes optional. Replace or eliminate all existing definitions of VM_KMEM_SIZE. With auto-sizing enabled, VM_KMEM_SIZE effectively became an alternate spelling for VM_KMEM_SIZE_MIN on most architectures. Use VM_KMEM_SIZE_MIN for clarity.
Diffstat (limited to 'sys')
-rw-r--r--sys/amd64/include/vmparam.h13
-rw-r--r--sys/arm/include/vmparam.h17
-rw-r--r--sys/i386/include/vmparam.h21
-rw-r--r--sys/ia64/include/vmparam.h12
-rw-r--r--sys/kern/kern_malloc.c54
-rw-r--r--sys/mips/include/vmparam.h19
-rw-r--r--sys/powerpc/include/vmparam.h18
-rw-r--r--sys/sparc64/include/vmparam.h18
8 files changed, 85 insertions, 87 deletions
diff --git a/sys/amd64/include/vmparam.h b/sys/amd64/include/vmparam.h
index 474ea4b..bda9722 100644
--- a/sys/amd64/include/vmparam.h
+++ b/sys/amd64/include/vmparam.h
@@ -178,23 +178,16 @@
#define PHYS_TO_DMAP(x) ((x) | DMAP_MIN_ADDRESS)
#define DMAP_TO_PHYS(x) ((x) & ~DMAP_MIN_ADDRESS)
-/* virtual sizes (bytes) for various kernel submaps */
-#ifndef VM_KMEM_SIZE
-#define VM_KMEM_SIZE (12 * 1024 * 1024)
-#endif
-
/*
- * How many physical pages per KVA page allocated.
- * min(max(max(VM_KMEM_SIZE, Physical memory/VM_KMEM_SIZE_SCALE),
- * VM_KMEM_SIZE_MIN), VM_KMEM_SIZE_MAX)
- * is the total KVA space allocated for kmem_map.
+ * How many physical pages per kmem arena virtual page.
*/
#ifndef VM_KMEM_SIZE_SCALE
#define VM_KMEM_SIZE_SCALE (1)
#endif
/*
- * Ceiling on amount of kmem_map kva space.
+ * Optional ceiling (in bytes) on the size of the kmem arena: 60% of the
+ * kernel map.
*/
#ifndef VM_KMEM_SIZE_MAX
#define VM_KMEM_SIZE_MAX ((VM_MAX_KERNEL_ADDRESS - \
diff --git a/sys/arm/include/vmparam.h b/sys/arm/include/vmparam.h
index 010834d..1f3d0d2 100644
--- a/sys/arm/include/vmparam.h
+++ b/sys/arm/include/vmparam.h
@@ -145,17 +145,22 @@
#define VM_MAX_KERNEL_ADDRESS (vm_max_kernel_address)
/*
- * Virtual size (bytes) for various kernel submaps.
+ * How many physical pages per kmem arena virtual page.
*/
-#ifndef VM_KMEM_SIZE
-#define VM_KMEM_SIZE (12*1024*1024)
-#endif
#ifndef VM_KMEM_SIZE_SCALE
-#define VM_KMEM_SIZE_SCALE (3)
+#define VM_KMEM_SIZE_SCALE (3)
+#endif
+
+/*
+ * Optional floor (in bytes) on the size of the kmem arena.
+ */
+#ifndef VM_KMEM_SIZE_MIN
+#define VM_KMEM_SIZE_MIN (12 * 1024 * 1024)
#endif
/*
- * Ceiling on the size of the kmem submap: 40% of the kernel map.
+ * Optional ceiling (in bytes) on the size of the kmem arena: 40% of the
+ * kernel map.
*/
#ifndef VM_KMEM_SIZE_MAX
#define VM_KMEM_SIZE_MAX ((vm_max_kernel_address - \
diff --git a/sys/i386/include/vmparam.h b/sys/i386/include/vmparam.h
index 19cdd8e..c086d76 100644
--- a/sys/i386/include/vmparam.h
+++ b/sys/i386/include/vmparam.h
@@ -164,24 +164,23 @@
#define VM_MAX_ADDRESS VADDR(PTDPTDI, PTDPTDI)
#define VM_MIN_ADDRESS ((vm_offset_t)0)
-/* virtual sizes (bytes) for various kernel submaps */
-#ifndef VM_KMEM_SIZE
-#define VM_KMEM_SIZE (12 * 1024 * 1024)
-#endif
-
/*
- * How many physical pages per KVA page allocated.
- * min(max(max(VM_KMEM_SIZE, Physical memory/VM_KMEM_SIZE_SCALE),
- * VM_KMEM_SIZE_MIN), VM_KMEM_SIZE_MAX)
- * is the total KVA space allocated for kmem_map.
+ * How many physical pages per kmem arena virtual page.
*/
#ifndef VM_KMEM_SIZE_SCALE
#define VM_KMEM_SIZE_SCALE (3)
#endif
/*
- * Ceiling on the amount of kmem_map KVA space: 40% of the entire KVA space
- * rounded to the nearest multiple of the superpage size.
+ * Optional floor (in bytes) on the size of the kmem arena.
+ */
+#ifndef VM_KMEM_SIZE_MIN
+#define VM_KMEM_SIZE_MIN (12 * 1024 * 1024)
+#endif
+
+/*
+ * Optional ceiling (in bytes) on the size of the kmem arena: 40% of the
+ * kernel map rounded to the nearest multiple of the superpage size.
*/
#ifndef VM_KMEM_SIZE_MAX
#define VM_KMEM_SIZE_MAX (((((VM_MAX_KERNEL_ADDRESS - \
diff --git a/sys/ia64/include/vmparam.h b/sys/ia64/include/vmparam.h
index 1fda472..edae4c4 100644
--- a/sys/ia64/include/vmparam.h
+++ b/sys/ia64/include/vmparam.h
@@ -189,19 +189,11 @@
#define USRSTACK VM_MAXUSER_ADDRESS
#define IA64_BACKINGSTORE (USRSTACK - (2 * MAXSSIZ) - PAGE_SIZE)
-/* virtual sizes (bytes) for various kernel submaps */
-#ifndef VM_KMEM_SIZE
-#define VM_KMEM_SIZE (12 * 1024 * 1024)
-#endif
-
/*
- * How many physical pages per KVA page allocated.
- * min(max(max(VM_KMEM_SIZE, Physical memory/VM_KMEM_SIZE_SCALE),
- * VM_KMEM_SIZE_MIN), VM_KMEM_SIZE_MAX)
- * is the total KVA space allocated for kmem_map.
+ * How many physical pages per kmem arena virtual page.
*/
#ifndef VM_KMEM_SIZE_SCALE
-#define VM_KMEM_SIZE_SCALE (4) /* XXX 8192 byte pages */
+#define VM_KMEM_SIZE_SCALE (4)
#endif
/* initial pagein size of beginning of executable file */
diff --git a/sys/kern/kern_malloc.c b/sys/kern/kern_malloc.c
index bab7456..a5d25ea 100644
--- a/sys/kern/kern_malloc.c
+++ b/sys/kern/kern_malloc.c
@@ -684,41 +684,47 @@ kmem_reclaim(vmem_t *vm, int flags)
pagedaemon_wakeup();
}
+CTASSERT(VM_KMEM_SIZE_SCALE >= 1);
+
/*
- * Initialize the kernel memory arena.
+ * Initialize the kernel memory (kmem) arena.
*/
void
kmeminit(void)
{
u_long mem_size, tmp;
-
+
/*
- * Try to auto-tune the kernel memory size, so that it is
- * more applicable for a wider range of machine sizes. The
- * VM_KMEM_SIZE_MAX is dependent on the maximum KVA space
- * available.
+ * Calculate the amount of kernel virtual address (KVA) space that is
+ * preallocated to the kmem arena. In order to support a wide range
+ * of machines, it is a function of the physical memory size,
+ * specifically,
+ *
+ * min(max(physical memory size / VM_KMEM_SIZE_SCALE,
+ * VM_KMEM_SIZE_MIN), VM_KMEM_SIZE_MAX)
*
- * Note that the kmem arena is also used by the zone allocator,
- * so make sure that there is enough space.
+ * Every architecture must define an integral value for
+ * VM_KMEM_SIZE_SCALE. However, the definitions of VM_KMEM_SIZE_MIN
+ * and VM_KMEM_SIZE_MAX, which represent respectively the floor and
+ * ceiling on this preallocation, are optional. Typically,
+ * VM_KMEM_SIZE_MAX is itself a function of the available KVA space on
+ * a given architecture.
*/
- vm_kmem_size = VM_KMEM_SIZE;
mem_size = cnt.v_page_count;
-#if defined(VM_KMEM_SIZE_SCALE)
vm_kmem_size_scale = VM_KMEM_SIZE_SCALE;
-#endif
TUNABLE_INT_FETCH("vm.kmem_size_scale", &vm_kmem_size_scale);
- if (vm_kmem_size_scale > 0 &&
- (mem_size / vm_kmem_size_scale) > (vm_kmem_size / PAGE_SIZE))
- vm_kmem_size = (mem_size / vm_kmem_size_scale) * PAGE_SIZE;
+ if (vm_kmem_size_scale < 1)
+ vm_kmem_size_scale = VM_KMEM_SIZE_SCALE;
+
+ vm_kmem_size = (mem_size / vm_kmem_size_scale) * PAGE_SIZE;
#if defined(VM_KMEM_SIZE_MIN)
vm_kmem_size_min = VM_KMEM_SIZE_MIN;
#endif
TUNABLE_ULONG_FETCH("vm.kmem_size_min", &vm_kmem_size_min);
- if (vm_kmem_size_min > 0 && vm_kmem_size < vm_kmem_size_min) {
+ if (vm_kmem_size_min > 0 && vm_kmem_size < vm_kmem_size_min)
vm_kmem_size = vm_kmem_size_min;
- }
#if defined(VM_KMEM_SIZE_MAX)
vm_kmem_size_max = VM_KMEM_SIZE_MAX;
@@ -727,15 +733,17 @@ kmeminit(void)
if (vm_kmem_size_max > 0 && vm_kmem_size >= vm_kmem_size_max)
vm_kmem_size = vm_kmem_size_max;
- /* Allow final override from the kernel environment */
- TUNABLE_ULONG_FETCH("vm.kmem_size", &vm_kmem_size);
-
/*
- * Limit kmem virtual size to twice the physical memory.
- * This allows for kmem map sparseness, but limits the size
- * to something sane. Be careful to not overflow the 32bit
- * ints while doing the check or the adjustment.
+ * Alternatively, the amount of KVA space that is preallocated to the
+ * kmem arena can be set statically at compile-time or manually
+ * through the kernel environment. However, it is still limited to
+ * twice the physical memory size, which has been sufficient to handle
+ * the most severe cases of external fragmentation in the kmem arena.
*/
+#if defined(VM_KMEM_SIZE)
+ vm_kmem_size = VM_KMEM_SIZE;
+#endif
+ TUNABLE_ULONG_FETCH("vm.kmem_size", &vm_kmem_size);
if (vm_kmem_size / 2 / PAGE_SIZE > mem_size)
vm_kmem_size = 2 * mem_size * PAGE_SIZE;
diff --git a/sys/mips/include/vmparam.h b/sys/mips/include/vmparam.h
index 4e1f03c..8922924 100644
--- a/sys/mips/include/vmparam.h
+++ b/sys/mips/include/vmparam.h
@@ -108,22 +108,23 @@
#define VM_NRESERVLEVEL 0
#endif
-/* virtual sizes (bytes) for various kernel submaps */
-#ifndef VM_KMEM_SIZE
-#define VM_KMEM_SIZE (12 * 1024 * 1024)
-#endif
-
/*
- * How many physical pages per KVA page allocated.
- * min(max(VM_KMEM_SIZE, Physical memory/VM_KMEM_SIZE_SCALE), VM_KMEM_SIZE_MAX)
- * is the total KVA space allocated for kmem_map.
+ * How many physical pages per kmem arena virtual page.
*/
#ifndef VM_KMEM_SIZE_SCALE
#define VM_KMEM_SIZE_SCALE (3)
#endif
/*
- * Ceiling on the amount of kmem_map KVA space: 40% of the entire KVA space.
+ * Optional floor (in bytes) on the size of the kmem arena.
+ */
+#ifndef VM_KMEM_SIZE_MIN
+#define VM_KMEM_SIZE_MIN (12 * 1024 * 1024)
+#endif
+
+/*
+ * Optional ceiling (in bytes) on the size of the kmem arena: 40% of the
+ * kernel map.
*/
#ifndef VM_KMEM_SIZE_MAX
#define VM_KMEM_SIZE_MAX ((VM_MAX_KERNEL_ADDRESS - \
diff --git a/sys/powerpc/include/vmparam.h b/sys/powerpc/include/vmparam.h
index e8e22cd..2d50f94 100644
--- a/sys/powerpc/include/vmparam.h
+++ b/sys/powerpc/include/vmparam.h
@@ -172,21 +172,23 @@ struct pmap_physseg {
#define SGROWSIZ (128UL*1024) /* amount to grow stack */
#endif
-#ifndef VM_KMEM_SIZE
-#define VM_KMEM_SIZE (12 * 1024 * 1024)
+/*
+ * How many physical pages per kmem arena virtual page.
+ */
+#ifndef VM_KMEM_SIZE_SCALE
+#define VM_KMEM_SIZE_SCALE (3)
#endif
/*
- * How many physical pages per KVA page allocated.
- * min(max(VM_KMEM_SIZE, Physical memory/VM_KMEM_SIZE_SCALE), VM_KMEM_SIZE_MAX)
- * is the total KVA space allocated for kmem_map.
+ * Optional floor (in bytes) on the size of the kmem arena.
*/
-#ifndef VM_KMEM_SIZE_SCALE
-#define VM_KMEM_SIZE_SCALE (3)
+#ifndef VM_KMEM_SIZE_MIN
+#define VM_KMEM_SIZE_MIN (12 * 1024 * 1024)
#endif
/*
- * Ceiling on the amount of kmem_map KVA space: 40% of the entire KVA space.
+ * Optional ceiling (in bytes) on the size of the kmem arena: 40% of the
+ * usable KVA space.
*/
#ifndef VM_KMEM_SIZE_MAX
#define VM_KMEM_SIZE_MAX ((VM_MAX_SAFE_KERNEL_ADDRESS - \
diff --git a/sys/sparc64/include/vmparam.h b/sys/sparc64/include/vmparam.h
index 3cd744c..b1c90d2 100644
--- a/sys/sparc64/include/vmparam.h
+++ b/sys/sparc64/include/vmparam.h
@@ -198,24 +198,22 @@
#define USRSTACK (VM_MAX_USER_ADDRESS)
/*
- * Virtual size (bytes) for various kernel submaps.
+ * How many physical pages per kmem arena virtual page.
*/
-#ifndef VM_KMEM_SIZE
-#define VM_KMEM_SIZE (16*1024*1024)
+#ifndef VM_KMEM_SIZE_SCALE
+#define VM_KMEM_SIZE_SCALE (tsb_kernel_ldd_phys == 0 ? 3 : 2)
#endif
/*
- * How many physical pages per KVA page allocated.
- * min(max(max(VM_KMEM_SIZE, Physical memory/VM_KMEM_SIZE_SCALE),
- * VM_KMEM_SIZE_MIN), VM_KMEM_SIZE_MAX)
- * is the total KVA space allocated for kmem_map.
+ * Optional floor (in bytes) on the size of the kmem arena.
*/
-#ifndef VM_KMEM_SIZE_SCALE
-#define VM_KMEM_SIZE_SCALE (tsb_kernel_ldd_phys == 0 ? 3 : 2)
+#ifndef VM_KMEM_SIZE_MIN
+#define VM_KMEM_SIZE_MIN (16 * 1024 * 1024)
#endif
/*
- * Ceiling on amount of kmem_map kva space.
+ * Optional ceiling (in bytes) on the size of the kmem arena: 60% of the
+ * kernel map.
*/
#ifndef VM_KMEM_SIZE_MAX
#define VM_KMEM_SIZE_MAX ((VM_MAX_KERNEL_ADDRESS - \
OpenPOWER on IntegriCloud