Module Name:    src
Committed By:   para
Date:           Sat Jan 26 15:18:01 UTC 2013

Modified Files:
        src/sys/kern: subr_vmem.c
        src/sys/rump/librump/rumpkern: vm.c
        src/sys/sys: vmem.h
        src/sys/uvm: uvm_km.c

Log Message:
revert previous commit not yet fully functional, sorry


To generate a diff of this commit:
cvs rdiff -u -r1.78 -r1.79 src/sys/kern/subr_vmem.c
cvs rdiff -u -r1.133 -r1.134 src/sys/rump/librump/rumpkern/vm.c
cvs rdiff -u -r1.18 -r1.19 src/sys/sys/vmem.h
cvs rdiff -u -r1.136 -r1.137 src/sys/uvm/uvm_km.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.78 src/sys/kern/subr_vmem.c:1.79
--- src/sys/kern/subr_vmem.c:1.78	Sat Jan 26 13:50:33 2013
+++ src/sys/kern/subr_vmem.c	Sat Jan 26 15:18:00 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_vmem.c,v 1.78 2013/01/26 13:50:33 para Exp $	*/
+/*	$NetBSD: subr_vmem.c,v 1.79 2013/01/26 15:18:00 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.78 2013/01/26 13:50:33 para Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.79 2013/01/26 15:18:00 para Exp $");
 
 #if defined(_KERNEL)
 #include "opt_ddb.h"
@@ -53,7 +53,6 @@ __KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,
 #include <sys/kmem.h>
 #include <sys/pool.h>
 #include <sys/vmem.h>
-#include <sys/vmem_impl.h>
 #include <sys/workqueue.h>
 #include <sys/atomic.h>
 #include <uvm/uvm.h>
@@ -62,13 +61,7 @@ __KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,
 #include <uvm/uvm_page.h>
 #include <uvm/uvm_pdaemon.h>
 #else /* defined(_KERNEL) */
-#include <stdio.h>
-#include <errno.h>
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
 #include "../sys/vmem.h"
-#include "../sys/vmem_impl.h"
 #endif /* defined(_KERNEL) */
 
 
@@ -85,23 +78,28 @@ VMEM_EVCNT_DEFINE(bt_pages)
 VMEM_EVCNT_DEFINE(bt_count)
 VMEM_EVCNT_DEFINE(bt_inuse)
 
-#define	VMEM_CONDVAR_INIT(vm, wchan)	cv_init(&vm->vm_cv, wchan)
-#define	VMEM_CONDVAR_DESTROY(vm)	cv_destroy(&vm->vm_cv)
-#define	VMEM_CONDVAR_WAIT(vm)		cv_wait(&vm->vm_cv, &vm->vm_lock)
-#define	VMEM_CONDVAR_BROADCAST(vm)	cv_broadcast(&vm->vm_cv)
+#define	LOCK_DECL(name)		\
+    kmutex_t name; char lockpad[COHERENCY_UNIT - sizeof(kmutex_t)]
+
+#define CONDVAR_DECL(name)	\
+    kcondvar_t name
 
 #else /* defined(_KERNEL) */
+#include <stdio.h>
+#include <errno.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
 
 #define VMEM_EVCNT_INCR(ev)	/* nothing */
 #define VMEM_EVCNT_DECR(ev)	/* nothing */
 
-#define	VMEM_CONDVAR_INIT(vm, wchan)	/* nothing */
-#define	VMEM_CONDVAR_DESTROY(vm)	/* nothing */
-#define	VMEM_CONDVAR_WAIT(vm)		/* nothing */
-#define	VMEM_CONDVAR_BROADCAST(vm)	/* nothing */
-
 #define	UNITTEST
 #define	KASSERT(a)		assert(a)
+#define	LOCK_DECL(name)		/* nothing */
+#define	CONDVAR_DECL(name)	/* nothing */
+#define	VMEM_CONDVAR_INIT(vm, wchan)	/* nothing */
+#define	VMEM_CONDVAR_BROADCAST(vm)	/* nothing */
 #define	mutex_init(a, b, c)	/* nothing */
 #define	mutex_destroy(a)	/* nothing */
 #define	mutex_enter(a)		/* nothing */
@@ -112,25 +110,74 @@ VMEM_EVCNT_DEFINE(bt_inuse)
 #define	panic(...)		printf(__VA_ARGS__); abort()
 #endif /* defined(_KERNEL) */
 
+struct vmem;
+struct vmem_btag;
+
 #if defined(VMEM_SANITY)
 static void vmem_check(vmem_t *);
 #else /* defined(VMEM_SANITY) */
 #define vmem_check(vm)	/* nothing */
 #endif /* defined(VMEM_SANITY) */
 
+#define	VMEM_MAXORDER		(sizeof(vmem_size_t) * CHAR_BIT)
+
 #define	VMEM_HASHSIZE_MIN	1	/* XXX */
 #define	VMEM_HASHSIZE_MAX	65536	/* XXX */
 #define	VMEM_HASHSIZE_INIT	1
 
 #define	VM_FITMASK	(VM_BESTFIT | VM_INSTANTFIT)
 
-#if defined(_KERNEL)
-static bool vmem_bootstrapped = false;
-static kmutex_t vmem_list_lock;
-static LIST_HEAD(, vmem) vmem_list = LIST_HEAD_INITIALIZER(vmem_list);
-#endif /* defined(_KERNEL) */
+CIRCLEQ_HEAD(vmem_seglist, vmem_btag);
+LIST_HEAD(vmem_freelist, vmem_btag);
+LIST_HEAD(vmem_hashlist, vmem_btag);
 
-/* ---- misc */
+#if defined(QCACHE)
+#define	VMEM_QCACHE_IDX_MAX	32
+
+#define	QC_NAME_MAX	16
+
+struct qcache {
+	pool_cache_t qc_cache;
+	vmem_t *qc_vmem;
+	char qc_name[QC_NAME_MAX];
+};
+typedef struct qcache qcache_t;
+#define	QC_POOL_TO_QCACHE(pool)	((qcache_t *)(pool->pr_qcache))
+#endif /* defined(QCACHE) */
+
+#define	VMEM_NAME_MAX	16
+
+/* vmem arena */
+struct vmem {
+	CONDVAR_DECL(vm_cv);
+	LOCK_DECL(vm_lock);
+	vm_flag_t vm_flags;
+	vmem_import_t *vm_importfn;
+	vmem_release_t *vm_releasefn;
+	size_t vm_nfreetags;
+	LIST_HEAD(, vmem_btag) vm_freetags;
+	void *vm_arg;
+	struct vmem_seglist vm_seglist;
+	struct vmem_freelist vm_freelist[VMEM_MAXORDER];
+	size_t vm_hashsize;
+	size_t vm_nbusytag;
+	struct vmem_hashlist *vm_hashlist;
+	struct vmem_hashlist vm_hash0;
+	size_t vm_quantum_mask;
+	int vm_quantum_shift;
+	size_t vm_size;
+	size_t vm_inuse;
+	char vm_name[VMEM_NAME_MAX+1];
+	LIST_ENTRY(vmem) vm_alllist;
+
+#if defined(QCACHE)
+	/* quantum cache */
+	size_t vm_qcache_max;
+	struct pool_allocator vm_qcache_allocator;
+	qcache_t vm_qcache_store[VMEM_QCACHE_IDX_MAX];
+	qcache_t *vm_qcache[VMEM_QCACHE_IDX_MAX];
+#endif /* defined(QCACHE) */
+};
 
 #define	VMEM_LOCK(vm)		mutex_enter(&vm->vm_lock)
 #define	VMEM_TRYLOCK(vm)	mutex_tryenter(&vm->vm_lock)
@@ -139,6 +186,44 @@ static LIST_HEAD(, vmem) vmem_list = LIS
 #define	VMEM_LOCK_DESTROY(vm)	mutex_destroy(&vm->vm_lock)
 #define	VMEM_ASSERT_LOCKED(vm)	KASSERT(mutex_owned(&vm->vm_lock))
 
+#if defined(_KERNEL)
+#define	VMEM_CONDVAR_INIT(vm, wchan)	cv_init(&vm->vm_cv, wchan)
+#define	VMEM_CONDVAR_DESTROY(vm)	cv_destroy(&vm->vm_cv)
+#define	VMEM_CONDVAR_WAIT(vm)		cv_wait(&vm->vm_cv, &vm->vm_lock)
+#define	VMEM_CONDVAR_BROADCAST(vm)	cv_broadcast(&vm->vm_cv)
+#endif /* defined(_KERNEL) */
+
+/* boundary tag */
+struct vmem_btag {
+	CIRCLEQ_ENTRY(vmem_btag) bt_seglist;
+	union {
+		LIST_ENTRY(vmem_btag) u_freelist; /* BT_TYPE_FREE */
+		LIST_ENTRY(vmem_btag) u_hashlist; /* BT_TYPE_BUSY */
+	} bt_u;
+#define	bt_hashlist	bt_u.u_hashlist
+#define	bt_freelist	bt_u.u_freelist
+	vmem_addr_t bt_start;
+	vmem_size_t bt_size;
+	int bt_type;
+};
+
+#define	BT_TYPE_SPAN		1
+#define	BT_TYPE_SPAN_STATIC	2
+#define	BT_TYPE_FREE		3
+#define	BT_TYPE_BUSY		4
+#define	BT_ISSPAN_P(bt)	((bt)->bt_type <= BT_TYPE_SPAN_STATIC)
+
+#define	BT_END(bt)	((bt)->bt_start + (bt)->bt_size - 1)
+
+typedef struct vmem_btag bt_t;
+
+#if defined(_KERNEL)
+static kmutex_t vmem_list_lock;
+static LIST_HEAD(, vmem) vmem_list = LIST_HEAD_INITIALIZER(vmem_list);
+#endif /* defined(_KERNEL) */
+
+/* ---- misc */
+
 #define	VMEM_ALIGNUP(addr, align) \
 	(-(-(addr) & -(align)))
 
@@ -156,26 +241,36 @@ 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);
 
 /*
+ * 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
+
+static struct vmem static_vmems[STATIC_VMEM_COUNT];
+static int static_vmem_count = STATIC_VMEM_COUNT;
 
 static struct vmem_btag static_bts[STATIC_BT_COUNT];
 static int static_bt_count = STATIC_BT_COUNT;
 
-static struct vmem kmem_va_meta_arena_store;
+static struct pool_cache static_qc_pools[STATIC_QC_POOL_COUNT];
+static int static_qc_pool_count = STATIC_QC_POOL_COUNT;
+
 vmem_t *kmem_va_meta_arena;
-static struct vmem kmem_meta_arena_store;
 vmem_t *kmem_meta_arena;
 
 static kmutex_t vmem_refill_lock;
@@ -557,17 +652,30 @@ qc_init(vmem_t *vm, size_t qcache_max, i
 		snprintf(qc->qc_name, sizeof(qc->qc_name), "%s-%zu",
 		    vm->vm_name, size);
 
-		pc = pool_cache_init(size,
-		    ORDER2SIZE(vm->vm_quantum_shift), 0,
-		    PR_NOALIGN | PR_NOTOUCH /* XXX */,
-		    qc->qc_name, pa, ipl, NULL, NULL, NULL);
-
+		if (vm->vm_flags & VM_BOOTSTRAP) {
+			KASSERT(static_qc_pool_count > 0);
+			pc = &static_qc_pools[--static_qc_pool_count];
+			pool_cache_bootstrap(pc, size,
+			    ORDER2SIZE(vm->vm_quantum_shift), 0,
+			    PR_NOALIGN | PR_NOTOUCH | PR_RECURSIVE /* XXX */,
+			    qc->qc_name, pa, ipl, NULL, NULL, NULL);
+		} else {
+			pc = pool_cache_init(size,
+			    ORDER2SIZE(vm->vm_quantum_shift), 0,
+			    PR_NOALIGN | PR_NOTOUCH /* XXX */,
+			    qc->qc_name, pa, ipl, NULL, NULL, NULL);
+		}
 		qc->qc_cache = pc;
 		KASSERT(qc->qc_cache != NULL);	/* XXX */
 		if (prevqc != NULL &&
 		    qc->qc_cache->pc_pool.pr_itemsperpage ==
 		    prevqc->qc_cache->pc_pool.pr_itemsperpage) {
-			pool_cache_destroy(qc->qc_cache);
+			if (vm->vm_flags & VM_BOOTSTRAP) {
+				pool_cache_bootstrap_destroy(pc);
+				//static_qc_pool_count++;
+			} else {
+				pool_cache_destroy(qc->qc_cache);
+			}
 			vm->vm_qcache[i - 1] = prevqc;
 			continue;
 		}
@@ -592,14 +700,18 @@ qc_destroy(vmem_t *vm)
 		if (prevqc == qc) {
 			continue;
 		}
-		pool_cache_destroy(qc->qc_cache);
+		if (vm->vm_flags & VM_BOOTSTRAP) {
+			pool_cache_bootstrap_destroy(qc->qc_cache);
+		} else {
+			pool_cache_destroy(qc->qc_cache);
+		}
 		prevqc = qc;
 	}
 }
 #endif
 
 #if defined(_KERNEL)
-static void
+void
 vmem_bootstrap(void)
 {
 
@@ -613,20 +725,18 @@ vmem_bootstrap(void)
 		VMEM_EVCNT_INCR(bt_count);
 		vmem_btag_freelist_count++;
 	}
-	vmem_bootstrapped = TRUE;
 }
 
 void
-vmem_create_arenas(vmem_t *vm)
+vmem_init(vmem_t *vm)
 {
 
-	kmem_va_meta_arena = vmem_init(&kmem_va_meta_arena_store, "vmem-va",
-	    0, 0, PAGE_SIZE, vmem_alloc, vmem_free, vm,
+	kmem_va_meta_arena = vmem_create("vmem-va", 0, 0, PAGE_SIZE,
+	    vmem_alloc, vmem_free, vm,
 	    0, VM_NOSLEEP | VM_BOOTSTRAP | VM_LARGEIMPORT,
 	    IPL_VM);
 
-	kmem_meta_arena = vmem_init(&kmem_meta_arena_store, "vmem-meta",
-	    0, 0, PAGE_SIZE,
+	kmem_meta_arena = vmem_create("vmem-meta", 0, 0, PAGE_SIZE,
 	    uvm_km_kmem_alloc, uvm_km_kmem_free, kmem_va_meta_arena,
 	    0, VM_NOSLEEP | VM_BOOTSTRAP, IPL_VM);
 }
@@ -708,7 +818,6 @@ vmem_destroy1(vmem_t *vm)
 		mutex_exit(&vmem_btag_lock);
 	}
 
-	VMEM_CONDVAR_DESTROY(vm);
 	VMEM_LOCK_DESTROY(vm);
 	xfree(vm, sizeof(*vm));
 }
@@ -850,32 +959,29 @@ vmem_fit(const bt_t *bt, vmem_size_t siz
 	return ENOMEM;
 }
 
-/* ---- vmem API */
 
 /*
  * vmem_create_internal: creates a vmem arena.
  */
 
-vmem_t *
-vmem_init(vmem_t *vm, const char *name,
-    vmem_addr_t base, vmem_size_t size, vmem_size_t quantum,
-    vmem_import_t *importfn, vmem_release_t *releasefn,
-    vmem_t *arg, vmem_size_t qcache_max, vm_flag_t flags, int ipl)
+static vmem_t *
+vmem_create_internal(const char *name, vmem_addr_t base, vmem_size_t size,
+    vmem_size_t quantum, vmem_import_t *importfn, vmem_release_t *releasefn,
+    void *arg, vmem_size_t qcache_max, vm_flag_t flags, int ipl)
 {
+	vmem_t *vm = NULL;
 	int i;
 
 	KASSERT((flags & (VM_SLEEP|VM_NOSLEEP)) != 0);
 	KASSERT((~flags & (VM_SLEEP|VM_NOSLEEP)) != 0);
 	KASSERT(quantum > 0);
 
+	if (flags & VM_BOOTSTRAP) {
 #if defined(_KERNEL)
-	/* XXX: SMP, we get called early... */
-	if (!vmem_bootstrapped) {
-		vmem_bootstrap();
-	}
+		KASSERT(static_vmem_count > 0);
+		vm = &static_vmems[--static_vmem_count];
 #endif /* defined(_KERNEL) */
-
-	if (vm == NULL) {
+	} else {
 		vm = xmalloc(sizeof(*vm), flags);
 	}
 	if (vm == NULL) {
@@ -905,9 +1011,14 @@ vmem_init(vmem_t *vm, const char *name,
 	for (i = 0; i < VMEM_MAXORDER; i++) {
 		LIST_INIT(&vm->vm_freelist[i]);
 	}
-	memset(&vm->vm_hash0, 0, sizeof(struct vmem_hashlist));
-	vm->vm_hashsize = 1;
-	vm->vm_hashlist = &vm->vm_hash0;
+	vm->vm_hashlist = NULL;
+	if (flags & VM_BOOTSTRAP) {
+		vm->vm_hashsize = 1;
+		vm->vm_hashlist = &vm->vm_hash0;
+	} else if (vmem_rehash(vm, VMEM_HASHSIZE_INIT, flags)) {
+		vmem_destroy1(vm);
+		return NULL;
+	}
 
 	if (size != 0) {
 		if (vmem_add(vm, base, size, flags) != 0) {
@@ -930,6 +1041,7 @@ vmem_init(vmem_t *vm, const char *name,
 }
 
 
+/* ---- vmem API */
 
 /*
  * vmem_create: create an arena.
@@ -943,9 +1055,11 @@ vmem_create(const char *name, vmem_addr_
     vmem_t *source, vmem_size_t qcache_max, vm_flag_t flags, int ipl)
 {
 
+	KASSERT((flags & (VM_SLEEP|VM_NOSLEEP)) != 0);
+	KASSERT((~flags & (VM_SLEEP|VM_NOSLEEP)) != 0);
 	KASSERT((flags & (VM_XIMPORT)) == 0);
 
-	return vmem_init(NULL, name, base, size, quantum,
+	return vmem_create_internal(name, base, size, quantum,
 	    importfn, releasefn, source, qcache_max, flags, ipl);
 }
 
@@ -961,9 +1075,11 @@ vmem_xcreate(const char *name, vmem_addr
     vmem_t *source, vmem_size_t qcache_max, vm_flag_t flags, int ipl)
 {
 
+	KASSERT((flags & (VM_SLEEP|VM_NOSLEEP)) != 0);
+	KASSERT((~flags & (VM_SLEEP|VM_NOSLEEP)) != 0);
 	KASSERT((flags & (VM_XIMPORT)) == 0);
 
-	return vmem_init(NULL, name, base, size, quantum,
+	return vmem_create_internal(name, base, size, quantum,
 	    (vmem_import_t *)importfn, releasefn, source,
 	    qcache_max, flags | VM_XIMPORT, ipl);
 }

Index: src/sys/rump/librump/rumpkern/vm.c
diff -u src/sys/rump/librump/rumpkern/vm.c:1.133 src/sys/rump/librump/rumpkern/vm.c:1.134
--- src/sys/rump/librump/rumpkern/vm.c:1.133	Sat Jan 26 13:50:33 2013
+++ src/sys/rump/librump/rumpkern/vm.c	Sat Jan 26 15:18:01 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: vm.c,v 1.133 2013/01/26 13:50:33 para Exp $	*/
+/*	$NetBSD: vm.c,v 1.134 2013/01/26 15:18:01 para Exp $	*/
 
 /*
  * Copyright (c) 2007-2011 Antti Kantee.  All Rights Reserved.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm.c,v 1.133 2013/01/26 13:50:33 para Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm.c,v 1.134 2013/01/26 15:18:01 para Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -338,11 +338,12 @@ uvm_init(void)
 	pool_subsystem_init();
 
 #ifndef RUMP_UNREAL_ALLOCATORS
+	vmem_bootstrap();
 	kmem_arena = vmem_create("kmem", 0, 1024*1024, PAGE_SIZE,
 	    NULL, NULL, NULL,
 	    0, VM_NOSLEEP | VM_BOOTSTRAP, IPL_VM);
 
-	vmem_create_arenas(kmem_arena);
+	vmem_init(kmem_arena);
 
 	kmem_va_arena = vmem_create("kva", 0, 0, PAGE_SIZE,
 	    vmem_alloc, vmem_free, kmem_arena,

Index: src/sys/sys/vmem.h
diff -u src/sys/sys/vmem.h:1.18 src/sys/sys/vmem.h:1.19
--- src/sys/sys/vmem.h:1.18	Sat Jan 26 13:50:33 2013
+++ src/sys/sys/vmem.h	Sat Jan 26 15:18:01 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: vmem.h,v 1.18 2013/01/26 13:50:33 para Exp $	*/
+/*	$NetBSD: vmem.h,v 1.19 2013/01/26 15:18:01 para Exp $	*/
 
 /*-
  * Copyright (c)2006 YAMAMOTO Takashi,
@@ -54,7 +54,8 @@ extern vmem_t *kmem_arena;
 extern vmem_t *kmem_meta_arena;
 extern vmem_t *kmem_va_arena;
 
-void vmem_create_arenas(vmem_t *vm);
+void vmem_bootstrap(void);
+void vmem_init(vmem_t *vm);
 
 vmem_t *vmem_create(const char *, vmem_addr_t, vmem_size_t, vmem_size_t,
     vmem_import_t *, vmem_release_t *, vmem_t *, vmem_size_t,
@@ -62,9 +63,6 @@ vmem_t *vmem_create(const char *, vmem_a
 vmem_t *vmem_xcreate(const char *, vmem_addr_t, vmem_size_t, vmem_size_t,
     vmem_ximport_t *, vmem_release_t *, vmem_t *, vmem_size_t,
     vm_flag_t, int);
-vmem_t *vmem_init(vmem_t *, const char *, vmem_addr_t, vmem_size_t, vmem_size_t,
-    vmem_import_t *, vmem_release_t *, vmem_t *, vmem_size_t,
-    vm_flag_t, int);
 void vmem_destroy(vmem_t *);
 int vmem_alloc(vmem_t *, vmem_size_t, vm_flag_t, vmem_addr_t *);
 void vmem_free(vmem_t *, vmem_addr_t, vmem_size_t);

Index: src/sys/uvm/uvm_km.c
diff -u src/sys/uvm/uvm_km.c:1.136 src/sys/uvm/uvm_km.c:1.137
--- src/sys/uvm/uvm_km.c:1.136	Sat Jan 26 13:50:33 2013
+++ src/sys/uvm/uvm_km.c	Sat Jan 26 15:18:01 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_km.c,v 1.136 2013/01/26 13:50:33 para Exp $	*/
+/*	$NetBSD: uvm_km.c,v 1.137 2013/01/26 15:18:01 para Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -152,7 +152,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1.136 2013/01/26 13:50:33 para Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1.137 2013/01/26 15:18:01 para Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -180,7 +180,6 @@ __KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1
 #include <sys/proc.h>
 #include <sys/pool.h>
 #include <sys/vmem.h>
-#include <sys/vmem_impl.h>
 #include <sys/kmem.h>
 
 #include <uvm/uvm.h>
@@ -203,7 +202,6 @@ int nkmempages = 0;
 vaddr_t kmembase;
 vsize_t kmemsize;
 
-static struct vmem kmem_arena_store;
 vmem_t *kmem_arena = NULL;
 vmem_t *kmem_va_arena;
 
@@ -326,9 +324,10 @@ uvm_km_bootstrap(vaddr_t start, vaddr_t 
 	kernel_map = &kernel_map_store;
 
 	pool_subsystem_init();
+	vmem_bootstrap();
 
-	kmem_arena = vmem_init(&kmem_arena_store, "kmem",
-	    kmembase, kmemsize, PAGE_SIZE, NULL, NULL, NULL,
+	kmem_arena = vmem_create("kmem", kmembase, kmemsize, PAGE_SIZE,
+	    NULL, NULL, NULL,
 	    0, VM_NOSLEEP | VM_BOOTSTRAP, IPL_VM);
 #ifdef PMAP_GROWKERNEL
 	/*
@@ -343,7 +342,7 @@ uvm_km_bootstrap(vaddr_t start, vaddr_t 
 	}
 #endif
 
-	vmem_create_arenas(kmem_arena);
+	vmem_init(kmem_arena);
 
 	UVMHIST_LOG(maphist, "kmem vmem created (base=%#"PRIxVADDR
 	    ", size=%#"PRIxVSIZE, kmembase, kmemsize, 0,0);
@@ -351,7 +350,7 @@ uvm_km_bootstrap(vaddr_t start, vaddr_t 
 	kmem_va_arena = vmem_create("kva", 0, 0, PAGE_SIZE,
 	    vmem_alloc, vmem_free, kmem_arena,
 	    (kmem_arena_small ? 4 : 8) * PAGE_SIZE,
-	    VM_NOSLEEP, IPL_VM);
+	    VM_NOSLEEP | VM_BOOTSTRAP, IPL_VM);
 
 	UVMHIST_LOG(maphist, "<- done", 0,0,0,0);
 }

Reply via email to