Index: uvm/uvm_map.c =================================================================== RCS file: /cvsroot/src/sys/uvm/uvm_map.c,v retrieving revision 1.305 diff -u -p -r1.305 uvm_map.c --- uvm/uvm_map.c 27 Sep 2011 01:02:39 -0000 1.305 +++ uvm/uvm_map.c 18 Oct 2011 18:34:28 -0000 @@ -1887,6 +1887,7 @@ uvm_map_space_avail(vaddr_t *start, vsiz if (uoffset != UVM_UNKNOWN_OFFSET) PMAP_PREFER(uoffset, start, length, topdown); #endif +#if defined(VA_PAGECOLORING) if ((flags & UVM_FLAG_COLORMATCH) != 0) { KASSERT(align < uvmexp.ncolors); if (uvmexp.ncolors > 1) { @@ -1908,6 +1909,9 @@ uvm_map_space_avail(vaddr_t *start, vsiz } } } else if (align != 0) { +#else + if (align != 0) { +#endif if ((*start & (align - 1)) != 0) { if (topdown) *start &= ~(align - 1); Index: uvm/uvm_page.c =================================================================== RCS file: /cvsroot/src/sys/uvm/uvm_page.c,v retrieving revision 1.178 diff -u -p -r1.178 uvm_page.c --- uvm/uvm_page.c 6 Oct 2011 12:26:03 -0000 1.178 +++ uvm/uvm_page.c 18 Oct 2011 18:34:28 -0000 @@ -1057,11 +1057,13 @@ uvm_page_recolor(int newncolors) if (oldbucketarray) free(oldbucketarray, M_VMPAGE); +#if 0 /* * this calls uvm_km_alloc() which may want to hold * uvm_fpageqlock. */ uvm_pager_realloc_emerg(); +#endif } /* @@ -1212,11 +1214,15 @@ uvm_pagealloc_strat(struct uvm_object *o */ ucpu = curcpu()->ci_data.cpu_uvm; +#if defined(VA_PAGECOLORING) if (flags & UVM_FLAG_COLORMATCH) { color = atop(off) & uvmexp.colormask; } else { color = ucpu->page_free_nextcolor; } +#else + color = ucpu->page_free_nextcolor; +#endif /* * check to see if we need to generate some free pages waking Index: uvm/uvm_pager.c =================================================================== RCS file: /cvsroot/src/sys/uvm/uvm_pager.c,v retrieving revision 1.106 diff -u -p -r1.106 uvm_pager.c --- uvm/uvm_pager.c 6 Oct 2011 12:26:03 -0000 1.106 +++ uvm/uvm_pager.c 18 Oct 2011 18:34:28 -0000 @@ -83,6 +83,7 @@ static vaddr_t emergva; static int emerg_ncolors; static bool emerginuse; +#if 0 void uvm_pager_realloc_emerg(void) { @@ -121,6 +122,7 @@ uvm_pager_realloc_emerg(void) round_page(MAXPHYS) + ptoa(old_emerg_ncolors), UVM_KMF_VAONLY); } +#endif /* * uvm_pager_init: init pagers (at boot time) @@ -142,7 +144,15 @@ uvm_pager_init(void) mutex_init(&pager_map_wanted_lock, MUTEX_DEFAULT, IPL_NONE); pager_map_wanted = false; - uvm_pager_realloc_emerg(); +#if defined(VA_PAGECOLORING) +#define MAX_VA_NCOLORS 8 + emerg_ncolors = MAX_VA_NCOLORS; +#else + emerg_ncolors = 1; +#endif + emergva = uvm_km_alloc(kernel_map, + round_page(MAXPHYS) + ptoa(emerg_ncolors - 1), ptoa(emerg_ncolors), + UVM_KMF_VAONLY); /* * init ASYNC I/O queue @@ -175,7 +185,13 @@ uvm_pagermapin(struct vm_page **pps, int struct vm_page *pp; vm_prot_t prot; const bool pdaemon = (curlwp == uvm.pagedaemon_lwp); +#if defined(VA_PAGECOLORING) const u_int first_color = VM_PGCOLOR_BUCKET(*pps); + const uvm_flag_t flag_color = UVM_FLAG_COLORMATCH; +#else + const u_int first_color = 0; + const uvm_flag_t flag_color = 0; +#endif UVMHIST_FUNC("uvm_pagermapin"); UVMHIST_CALLED(maphist); UVMHIST_LOG(maphist,"(pps=0x%x, npages=%d, first_color=%u)", @@ -195,7 +211,7 @@ ReStart: kva = 0; /* let system choose VA */ if (uvm_map(pager_map, &kva, size, NULL, UVM_UNKNOWN_OFFSET, - first_color, UVM_FLAG_COLORMATCH | UVM_FLAG_NOMERGE + first_color, flag_color | UVM_FLAG_NOMERGE | (pdaemon ? UVM_FLAG_NOWAIT : 0)) != 0) { if (pdaemon) { mutex_enter(&pager_map_wanted_lock); @@ -229,7 +245,10 @@ enter: for (cva = kva; npages != 0; npages--, cva += PAGE_SIZE) { pp = *pps++; KASSERT(pp); - // KASSERT(!((VM_PAGE_TO_PHYS(pp) ^ cva) & uvmexp.colormask)); +#if 0 + KASSERT(((VM_PAGE_TO_PHYS(pp) ^ cva) & + (ptoa(uvm_va_ncolors) - 1)) == 0); +#endif KASSERT(pp->flags & PG_BUSY); pmap_kenter_pa(cva, VM_PAGE_TO_PHYS(pp), prot, 0); } @@ -262,7 +281,7 @@ uvm_pagermapout(vaddr_t kva, int npages) pmap_kremove(kva, size); pmap_update(pmap_kernel()); - if ((kva & ~ptoa(uvmexp.colormask)) == emergva) { + if (emergva <= kva && kva <= emergva + ptoa(emerg_ncolors - 1)) { mutex_enter(&pager_map_wanted_lock); KASSERT(emerginuse); emerginuse = false; Index: uvm/uvm_pager.h =================================================================== RCS file: /cvsroot/src/sys/uvm/uvm_pager.h,v retrieving revision 1.42 diff -u -p -r1.42 uvm_pager.h --- uvm/uvm_pager.h 28 Sep 2011 22:52:15 -0000 1.42 +++ uvm/uvm_pager.h 18 Oct 2011 18:34:28 -0000 @@ -165,7 +165,9 @@ struct uvm_pagerops { */ void uvm_pager_init(void); +#if 0 void uvm_pager_realloc_emerg(void); +#endif struct vm_page *uvm_pageratop(vaddr_t); vaddr_t uvm_pagermapin(struct vm_page **, int, int); void uvm_pagermapout(vaddr_t, int);