Module Name:    src
Committed By:   matt
Date:           Wed Sep 28 22:52:16 UTC 2011

Modified Files:
        src/sys/uvm: uvm_page.c uvm_pager.c uvm_pager.h

Log Message:
Reallocate emergency pager va when ncolors is increased. (modication of
patch from mrg).


To generate a diff of this commit:
cvs rdiff -u -r1.175 -r1.176 src/sys/uvm/uvm_page.c
cvs rdiff -u -r1.104 -r1.105 src/sys/uvm/uvm_pager.c
cvs rdiff -u -r1.41 -r1.42 src/sys/uvm/uvm_pager.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/uvm/uvm_page.c
diff -u src/sys/uvm/uvm_page.c:1.175 src/sys/uvm/uvm_page.c:1.176
--- src/sys/uvm/uvm_page.c:1.175	Wed Jun 15 19:46:11 2011
+++ src/sys/uvm/uvm_page.c	Wed Sep 28 22:52:15 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_page.c,v 1.175 2011/06/15 19:46:11 rmind Exp $	*/
+/*	$NetBSD: uvm_page.c,v 1.176 2011/09/28 22:52:15 matt Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.175 2011/06/15 19:46:11 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.176 2011/09/28 22:52:15 matt Exp $");
 
 #include "opt_ddb.h"
 #include "opt_uvmhist.h"
@@ -1045,6 +1045,8 @@ uvm_page_recolor(int newncolors)
 		ucpu->page_free[lcv].pgfl_buckets = pgfl.pgfl_buckets;
 	}
 
+	uvm_pager_realloc_emerg();
+
 	if (have_recolored_pages) {
 		mutex_spin_exit(&uvm_fpageqlock);
 		free(oldbucketarray, M_VMPAGE);

Index: src/sys/uvm/uvm_pager.c
diff -u src/sys/uvm/uvm_pager.c:1.104 src/sys/uvm/uvm_pager.c:1.105
--- src/sys/uvm/uvm_pager.c:1.104	Thu Sep  1 06:40:28 2011
+++ src/sys/uvm/uvm_pager.c	Wed Sep 28 22:52:15 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_pager.c,v 1.104 2011/09/01 06:40:28 matt Exp $	*/
+/*	$NetBSD: uvm_pager.c,v 1.105 2011/09/28 22:52:15 matt Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_pager.c,v 1.104 2011/09/01 06:40:28 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_pager.c,v 1.105 2011/09/28 22:52:15 matt Exp $");
 
 #include "opt_uvmhist.h"
 #include "opt_readahead.h"
@@ -80,8 +80,48 @@ struct vm_map *pager_map;		/* XXX */
 kmutex_t pager_map_wanted_lock;
 bool pager_map_wanted;	/* locked by pager map */
 static vaddr_t emergva;
+static int emerg_ncolors;
 static bool emerginuse;
 
+void
+uvm_pager_realloc_emerg(void)
+{
+	vaddr_t new_emergva, old_emergva;
+	int old_emerg_ncolors;
+
+	if (__predict_true(emergva != 0 && emerg_ncolors >= uvmexp.ncolors))
+		return;
+
+	KASSERT(!emerginuse);
+
+	new_emergva = uvm_km_alloc(kernel_map,
+	    round_page(MAXPHYS) + ptoa(uvmexp.ncolors), 0,
+	    UVM_KMF_VAONLY);
+
+	KASSERT(new_emergva != 0);
+
+	old_emergva = emergva;
+	old_emerg_ncolors = emerg_ncolors;
+
+	/*
+	 * don't support re-color in late boot anyway.
+	 */
+	if (0) /* XXX */
+		mutex_enter(&pager_map_wanted_lock);
+
+	emergva = new_emergva;
+	emerg_ncolors = uvmexp.ncolors;
+	wakeup(&old_emergva);
+
+	if (0) /* XXX */
+		mutex_exit(&pager_map_wanted_lock);
+
+	if (old_emergva)
+		uvm_km_free(kernel_map, old_emergva,
+		    round_page(MAXPHYS) + ptoa(old_emerg_ncolors),
+		    UVM_KMF_VAONLY);
+}
+
 /*
  * uvm_pager_init: init pagers (at boot time)
  */
@@ -101,14 +141,8 @@ uvm_pager_init(void)
 	    false, NULL);
 	mutex_init(&pager_map_wanted_lock, MUTEX_DEFAULT, IPL_NONE);
 	pager_map_wanted = false;
-	emergva = uvm_km_alloc(kernel_map,
-	    round_page(MAXPHYS) + ptoa(uvmexp.ncolors), 0,
-	    UVM_KMF_VAONLY);
-#if defined(DEBUG)
-	if (emergva == 0)
-		panic("emergva");
-#endif
-	emerginuse = false;
+
+	uvm_pager_realloc_emerg();
 
 	/*
 	 * init ASYNC I/O queue

Index: src/sys/uvm/uvm_pager.h
diff -u src/sys/uvm/uvm_pager.h:1.41 src/sys/uvm/uvm_pager.h:1.42
--- src/sys/uvm/uvm_pager.h:1.41	Wed Feb  2 20:07:25 2011
+++ src/sys/uvm/uvm_pager.h	Wed Sep 28 22:52:15 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_pager.h,v 1.41 2011/02/02 20:07:25 chuck Exp $	*/
+/*	$NetBSD: uvm_pager.h,v 1.42 2011/09/28 22:52:15 matt Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -165,6 +165,7 @@ struct uvm_pagerops {
  */
 
 void	uvm_pager_init(void);
+void	uvm_pager_realloc_emerg(void);
 struct vm_page *uvm_pageratop(vaddr_t);
 vaddr_t	uvm_pagermapin(struct vm_page **, int, int);
 void	uvm_pagermapout(vaddr_t, int);

Reply via email to