Module Name: src
Committed By: para
Date: Sat Sep 1 12:28:59 UTC 2012
Modified Files:
src/sys/kern: subr_vmem.c
Log Message:
rework boundary-tag reserve calculation, make it more precise.
add comment about the rational behind the sizing of certain vars
used by allocation and bootstrap.
as requested by yamt@
To generate a diff of this commit:
cvs rdiff -u -r1.74 -r1.75 src/sys/kern/subr_vmem.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/subr_vmem.c
diff -u src/sys/kern/subr_vmem.c:1.74 src/sys/kern/subr_vmem.c:1.75
--- src/sys/kern/subr_vmem.c:1.74 Mon Jul 30 17:49:24 2012
+++ src/sys/kern/subr_vmem.c Sat Sep 1 12:28:58 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_vmem.c,v 1.74 2012/07/30 17:49:24 njoly Exp $ */
+/* $NetBSD: subr_vmem.c,v 1.75 2012/09/01 12:28:58 para Exp $ */
/*-
* Copyright (c)2006,2007,2008,2009 YAMAMOTO Takashi,
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.74 2012/07/30 17:49:24 njoly Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.75 2012/09/01 12:28:58 para Exp $");
#if defined(_KERNEL)
#include "opt_ddb.h"
@@ -241,13 +241,23 @@ static LIST_HEAD(, vmem) vmem_list = LIS
#else /* defined(_KERNEL) */
#define xmalloc(sz, flags) \
- kmem_alloc(sz, ((flags) & VM_SLEEP) ? KM_SLEEP : KM_NOSLEEP);
-#define xfree(p, sz) kmem_free(p, sz);
+ kmem_intr_alloc(sz, ((flags) & VM_SLEEP) ? KM_SLEEP : KM_NOSLEEP);
+#define xfree(p, sz) kmem_intr_free(p, sz);
-#define BT_MINRESERVE 6
-#define BT_MAXFREE 64
-#define STATIC_VMEM_COUNT 5
+/*
+ * Memory for arenas initialized during bootstrap.
+ * There is memory for STATIC_VMEM_COUNT bootstrap arenas.
+ *
+ * BT_RESERVE calculation:
+ * we allocate memory for boundry tags with vmem, therefor we have
+ * to keep a reserve of bts used to allocated memory for bts.
+ * This reserve is 4 for each arena involved in allocating vmems memory.
+ * BT_MAXFREE: don't cache excessive counts of bts in arenas
+ */
+#define STATIC_VMEM_COUNT 4
#define STATIC_BT_COUNT 200
+#define BT_MINRESERVE 4
+#define BT_MAXFREE 64
/* must be equal or greater then qcache multiplier for kmem_va_arena */
#define STATIC_QC_POOL_COUNT 8
@@ -283,7 +293,7 @@ bt_refillglobal(vm_flag_t flags)
int i;
mutex_enter(&vmem_btag_lock);
- if (vmem_btag_freelist_count > (BT_MINRESERVE * 16)) {
+ if (vmem_btag_freelist_count > 0) {
mutex_exit(&vmem_btag_lock);
return 0;
}
@@ -325,7 +335,7 @@ bt_refill(vmem_t *vm, vm_flag_t flags)
VMEM_LOCK(vm);
mutex_enter(&vmem_btag_lock);
while (!LIST_EMPTY(&vmem_btag_freelist) &&
- vm->vm_nfreetags < (BT_MINRESERVE * 2)) {
+ vm->vm_nfreetags <= BT_MINRESERVE) {
bt = LIST_FIRST(&vmem_btag_freelist);
LIST_REMOVE(bt, bt_freelist);
LIST_INSERT_HEAD(&vm->vm_freetags, bt, bt_freelist);
@@ -349,7 +359,7 @@ bt_alloc(vmem_t *vm, vm_flag_t flags)
bt_t *bt;
again:
VMEM_LOCK(vm);
- if (vm->vm_nfreetags < BT_MINRESERVE &&
+ if (vm->vm_nfreetags <= BT_MINRESERVE &&
(flags & VM_POPULATING) == 0) {
VMEM_UNLOCK(vm);
if (bt_refill(vm, VM_NOSLEEP | VM_INSTANTFIT)) {