Module Name:    src
Committed By:   para
Date:           Wed Feb  1 23:43:49 UTC 2012

Modified Files:
        src/sys/kern: subr_vmem.c vfs_bio.c
        src/sys/uvm: uvm_glue.c uvm_km.c uvm_pdaemon.c

Log Message:
allocate uareas and buffers from kernel_map again
add code to drain pools if kmem_arena runs out of space


To generate a diff of this commit:
cvs rdiff -u -r1.70 -r1.71 src/sys/kern/subr_vmem.c
cvs rdiff -u -r1.235 -r1.236 src/sys/kern/vfs_bio.c
cvs rdiff -u -r1.153 -r1.154 src/sys/uvm/uvm_glue.c
cvs rdiff -u -r1.115 -r1.116 src/sys/uvm/uvm_km.c
cvs rdiff -u -r1.104 -r1.105 src/sys/uvm/uvm_pdaemon.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.70 src/sys/kern/subr_vmem.c:1.71
--- src/sys/kern/subr_vmem.c:1.70	Mon Jan 30 17:35:18 2012
+++ src/sys/kern/subr_vmem.c	Wed Feb  1 23:43:49 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_vmem.c,v 1.70 2012/01/30 17:35:18 para Exp $	*/
+/*	$NetBSD: subr_vmem.c,v 1.71 2012/02/01 23:43:49 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.70 2012/01/30 17:35:18 para Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,v 1.71 2012/02/01 23:43:49 para Exp $");
 
 #if defined(_KERNEL)
 #include "opt_ddb.h"
@@ -1245,6 +1245,11 @@ retry:
 	/* XXX */
 
 	if ((flags & VM_SLEEP) != 0) {
+#if defined(_KERNEL) && !defined(_RUMPKERNEL)
+		mutex_spin_enter(&uvm_fpageqlock);
+		uvm_kick_pdaemon();
+		mutex_spin_exit(&uvm_fpageqlock);
+#endif
 		VMEM_LOCK(vm);
 		VMEM_CONDVAR_WAIT(vm);
 		VMEM_UNLOCK(vm);

Index: src/sys/kern/vfs_bio.c
diff -u src/sys/kern/vfs_bio.c:1.235 src/sys/kern/vfs_bio.c:1.236
--- src/sys/kern/vfs_bio.c:1.235	Sat Jan 28 00:00:06 2012
+++ src/sys/kern/vfs_bio.c	Wed Feb  1 23:43:49 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_bio.c,v 1.235 2012/01/28 00:00:06 rmind Exp $	*/
+/*	$NetBSD: vfs_bio.c,v 1.236 2012/02/01 23:43:49 para Exp $	*/
 
 /*-
  * Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -123,7 +123,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.235 2012/01/28 00:00:06 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.236 2012/02/01 23:43:49 para Exp $");
 
 #include "opt_bufcache.h"
 
@@ -231,21 +231,18 @@ static struct vm_map *buf_map;
 static void *
 bufpool_page_alloc(struct pool *pp, int flags)
 {
-	const vm_flag_t vflags = (flags & PR_WAITOK) ? VM_SLEEP: VM_NOSLEEP;
-	vmem_addr_t va;
-	int ret;
 
-	ret = uvm_km_kmem_alloc(kmem_va_arena, MAXBSIZE,
-	    vflags | VM_INSTANTFIT, &va);
-
-	return ret ? NULL : (void *)va;
+	return (void *)uvm_km_alloc(buf_map,
+	    MAXBSIZE, MAXBSIZE,
+	    ((flags & PR_WAITOK) ? 0 : UVM_KMF_NOWAIT|UVM_KMF_TRYLOCK)
+	    | UVM_KMF_WIRED);
 }
 
 static void
 bufpool_page_free(struct pool *pp, void *v)
 {
 
-	uvm_km_kmem_free(kmem_va_arena, (vaddr_t)v, MAXBSIZE);
+	uvm_km_free(buf_map, (vaddr_t)v, MAXBSIZE, UVM_KMF_WIRED);
 }
 
 static struct pool_allocator bufmempool_allocator = {
@@ -491,7 +488,7 @@ bufinit(void)
 		pa = (size <= PAGE_SIZE && use_std)
 			? &pool_allocator_nointr
 			: &bufmempool_allocator;
-		pool_init(pp, size, 0, 0, PR_NOALIGN, name, pa, IPL_NONE);
+		pool_init(pp, size, 0, 0, 0, name, pa, IPL_NONE);
 		pool_setlowat(pp, 1);
 		pool_sethiwat(pp, 1);
 	}

Index: src/sys/uvm/uvm_glue.c
diff -u src/sys/uvm/uvm_glue.c:1.153 src/sys/uvm/uvm_glue.c:1.154
--- src/sys/uvm/uvm_glue.c:1.153	Fri Jan 27 19:48:41 2012
+++ src/sys/uvm/uvm_glue.c	Wed Feb  1 23:43:49 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_glue.c,v 1.153 2012/01/27 19:48:41 para Exp $	*/
+/*	$NetBSD: uvm_glue.c,v 1.154 2012/02/01 23:43:49 para Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_glue.c,v 1.153 2012/01/27 19:48:41 para Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_glue.c,v 1.154 2012/02/01 23:43:49 para Exp $");
 
 #include "opt_kgdb.h"
 #include "opt_kstack.h"
@@ -240,15 +240,26 @@ static pool_cache_t uvm_uarea_system_cac
 static void *
 uarea_poolpage_alloc(struct pool *pp, int flags)
 {
-	if (USPACE_ALIGN == 0) {
-		int rc;
-		vmem_addr_t va;
-
-		rc = uvm_km_kmem_alloc(kmem_va_arena, USPACE,
-		    ((flags & PR_WAITOK) ? VM_SLEEP: VM_NOSLEEP) |
-		    VM_INSTANTFIT, &va);
-		return (rc != 0) ? NULL : (void *)va;
+#if defined(PMAP_MAP_POOLPAGE)
+	if (USPACE == PAGE_SIZE && USPACE_ALIGN == 0) {
+		struct vm_page *pg;
+		vaddr_t va;
+
+#if defined(PMAP_ALLOC_POOLPAGE)
+		pg = PMAP_ALLOC_POOLPAGE(
+		   ((flags & PR_WAITOK) == 0 ? UVM_KMF_NOWAIT : 0));
+#else
+		pg = uvm_pagealloc(NULL, 0, NULL,
+		   ((flags & PR_WAITOK) == 0 ? UVM_KMF_NOWAIT : 0));
+#endif
+		if (pg == NULL)
+			return NULL;
+		va = PMAP_MAP_POOLPAGE(VM_PAGE_TO_PHYS(pg));
+		if (va == 0)
+			uvm_pagefree(pg);
+		return (void *)va;
 	}
+#endif
 #if defined(__HAVE_CPU_UAREA_ROUTINES)
 	void *va = cpu_uarea_alloc(false);
 	if (va)
@@ -263,10 +274,16 @@ uarea_poolpage_alloc(struct pool *pp, in
 static void
 uarea_poolpage_free(struct pool *pp, void *addr)
 {
-	if (USPACE_ALIGN == 0) {
-		uvm_km_kmem_free(kmem_va_arena, (vmem_addr_t)addr, USPACE);
+#if defined(PMAP_MAP_POOLPAGE)
+	if (USPACE == PAGE_SIZE && USPACE_ALIGN == 0) {
+		paddr_t pa;
+
+		pa = PMAP_UNMAP_POOLPAGE((vaddr_t) addr);
+		KASSERT(pa != 0);
+		uvm_pagefree(PHYS_TO_VM_PAGE(pa));
 		return;
 	}
+#endif
 #if defined(__HAVE_CPU_UAREA_ROUTINES)
 	if (cpu_uarea_free(addr))
 		return;

Index: src/sys/uvm/uvm_km.c
diff -u src/sys/uvm/uvm_km.c:1.115 src/sys/uvm/uvm_km.c:1.116
--- src/sys/uvm/uvm_km.c:1.115	Wed Feb  1 02:22:27 2012
+++ src/sys/uvm/uvm_km.c	Wed Feb  1 23:43:49 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_km.c,v 1.115 2012/02/01 02:22:27 matt Exp $	*/
+/*	$NetBSD: uvm_km.c,v 1.116 2012/02/01 23:43:49 para Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -120,7 +120,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1.115 2012/02/01 02:22:27 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1.116 2012/02/01 23:43:49 para Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -167,8 +167,8 @@ uvm_km_bootstrap(vaddr_t start, vaddr_t 
 {
 	vaddr_t base = VM_MIN_KERNEL_ADDRESS;
 
-	kmemsize = MIN(((((vsize_t)(end - start)) / 3) * 2),
-	    ((((vsize_t)uvmexp.npages) * PAGE_SIZE)));
+	kmemsize = MIN((((vsize_t)(end - start)) / 3),
+	    ((((vsize_t)uvmexp.npages) * PAGE_SIZE) / 2));
 	kmemsize = round_page(kmemsize);
 
 	/*

Index: src/sys/uvm/uvm_pdaemon.c
diff -u src/sys/uvm/uvm_pdaemon.c:1.104 src/sys/uvm/uvm_pdaemon.c:1.105
--- src/sys/uvm/uvm_pdaemon.c:1.104	Fri Jan 27 19:48:42 2012
+++ src/sys/uvm/uvm_pdaemon.c	Wed Feb  1 23:43:49 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_pdaemon.c,v 1.104 2012/01/27 19:48:42 para Exp $	*/
+/*	$NetBSD: uvm_pdaemon.c,v 1.105 2012/02/01 23:43:49 para Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_pdaemon.c,v 1.104 2012/01/27 19:48:42 para Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_pdaemon.c,v 1.105 2012/02/01 23:43:49 para Exp $");
 
 #include "opt_uvmhist.h"
 #include "opt_readahead.h"
@@ -173,7 +173,8 @@ uvm_kick_pdaemon(void)
 
 	if (uvmexp.free + uvmexp.paging < uvmexp.freemin ||
 	    (uvmexp.free + uvmexp.paging < uvmexp.freetarg &&
-	     uvmpdpol_needsscan_p())) {
+	     uvmpdpol_needsscan_p()) ||
+	     uvm_km_va_starved_p()) {
 		wakeup(&uvm.pagedaemon);
 	}
 }
@@ -248,10 +249,13 @@ uvm_pageout(void *arg)
 	 */
 
 	for (;;) {
-		bool needsscan, needsfree;
+		bool needsscan, needsfree, kmem_va_starved;
+
+		kmem_va_starved = uvm_km_va_starved_p();
 
 		mutex_spin_enter(&uvm_fpageqlock);
-		if (uvm_pagedaemon_waiters == 0 || uvmexp.paging > 0) {
+		if ((uvm_pagedaemon_waiters == 0 || uvmexp.paging > 0) &&
+		    !kmem_va_starved) {
 			UVMHIST_LOG(pdhist,"  <<SLEEPING>>",0,0,0,0);
 			UVM_UNLOCK_AND_WAIT(&uvm.pagedaemon,
 			    &uvm_fpageqlock, false, "pgdaemon", 0);
@@ -320,7 +324,7 @@ uvm_pageout(void *arg)
 		 * if we don't need free memory, we're done.
 		 */
 
-		if (!needsfree && !uvm_km_va_starved_p())
+		if (!needsfree && !kmem_va_starved)
 			continue;
 
 		/*

Reply via email to