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