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);