Index: uvm_page.c =================================================================== RCS file: /cvsroot/src/sys/uvm/uvm_page.c,v retrieving revision 1.175 diff -p -r1.175 uvm_page.c *** uvm_page.c 15 Jun 2011 19:46:11 -0000 1.175 --- uvm_page.c 28 Sep 2011 12:33:34 -0000 *************** uvm_page_recolor(int newncolors) *** 1045,1050 **** --- 1045,1052 ---- 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: uvm_pager.c =================================================================== RCS file: /cvsroot/src/sys/uvm/uvm_pager.c,v retrieving revision 1.104 diff -p -r1.104 uvm_pager.c *** uvm_pager.c 1 Sep 2011 06:40:28 -0000 1.104 --- uvm_pager.c 28 Sep 2011 12:33:34 -0000 *************** struct vm_map *pager_map; /* XXX */ *** 80,87 **** --- 80,130 ---- kmutex_t pager_map_wanted_lock; bool pager_map_wanted; /* locked by pager map */ static vaddr_t emergva; + static bool emerg_ever_used; + static int emerg_ncolors; static bool emerginuse; + void + uvm_pager_realloc_emerg(void) + { + vaddr_t new_emergva, old_emergva; + int old_emerg_ncolors; + + if (emergva != 0 && emerg_ncolors >= uvmexp.ncolors) + return; + + new_emergva = uvm_km_alloc(kernel_map, + round_page(MAXPHYS) + ptoa(uvmexp.ncolors), 0, + UVM_KMF_VAONLY); + #if defined(DEBUG) + if (new_emergva == 0) + panic("new_emergva"); + #endif + + 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); + KASSERT(!emerg_ever_used); + + emergva = new_emergva; + emerg_ncolors = uvmexp.ncolors; + emerginuse = false; + 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) */ *************** uvm_pager_init(void) *** 101,113 **** 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; /* --- 144,151 ---- false, NULL); mutex_init(&pager_map_wanted_lock, MUTEX_DEFAULT, IPL_NONE); pager_map_wanted = false; ! ! uvm_pager_realloc_emerg(); emerginuse = false; /* *************** ReStart: *** 165,170 **** --- 203,209 ---- | (pdaemon ? UVM_FLAG_NOWAIT : 0)) != 0) { if (pdaemon) { mutex_enter(&pager_map_wanted_lock); + emerg_ever_used = true; if (emerginuse) { UVM_UNLOCK_AND_WAIT(&emergva, &pager_map_wanted_lock, false, Index: uvm_pager.h =================================================================== RCS file: /cvsroot/src/sys/uvm/uvm_pager.h,v retrieving revision 1.41 diff -p -r1.41 uvm_pager.h *** uvm_pager.h 2 Feb 2011 20:07:25 -0000 1.41 --- uvm_pager.h 28 Sep 2011 12:33:34 -0000 *************** struct uvm_pagerops { *** 165,170 **** --- 165,171 ---- */ 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);