Module Name: src Committed By: uebayasi Date: Thu Oct 6 12:26:03 UTC 2011
Modified Files: src/sys/uvm: uvm_page.c uvm_pager.c Log Message: Correct pagermap emergva allocation. From yamt@. Tested by building i386 kernel with DTRACE defined which died 100%. To generate a diff of this commit: cvs rdiff -u -r1.177 -r1.178 src/sys/uvm/uvm_page.c cvs rdiff -u -r1.105 -r1.106 src/sys/uvm/uvm_pager.c 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.177 src/sys/uvm/uvm_page.c:1.178 --- src/sys/uvm/uvm_page.c:1.177 Fri Sep 30 05:29:12 2011 +++ src/sys/uvm/uvm_page.c Thu Oct 6 12:26:03 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_page.c,v 1.177 2011/09/30 05:29:12 mrg Exp $ */ +/* $NetBSD: uvm_page.c,v 1.178 2011/10/06 12:26:03 uebayasi 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.177 2011/09/30 05:29:12 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.178 2011/10/06 12:26:03 uebayasi Exp $"); #include "opt_ddb.h" #include "opt_uvmhist.h" @@ -393,6 +393,7 @@ uvm_page_init(vaddr_t *kvm_startp, vaddr if (uvmexp.ncolors == 0) uvmexp.ncolors = 1; uvmexp.colormask = uvmexp.ncolors - 1; + KASSERT((uvmexp.colormask & uvmexp.ncolors) == 0); /* * we now know we have (PAGE_SIZE * freepages) bytes of memory we can @@ -986,6 +987,8 @@ uvm_page_recolor(int newncolors) int lcv, color, i, ocolors; struct uvm_cpu *ucpu; + KASSERT(((newncolors - 1) & newncolors) == 0); + if (newncolors <= uvmexp.ncolors) return; Index: src/sys/uvm/uvm_pager.c diff -u src/sys/uvm/uvm_pager.c:1.105 src/sys/uvm/uvm_pager.c:1.106 --- src/sys/uvm/uvm_pager.c:1.105 Wed Sep 28 22:52:15 2011 +++ src/sys/uvm/uvm_pager.c Thu Oct 6 12:26:03 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_pager.c,v 1.105 2011/09/28 22:52:15 matt Exp $ */ +/* $NetBSD: uvm_pager.c,v 1.106 2011/10/06 12:26:03 uebayasi 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.105 2011/09/28 22:52:15 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_pager.c,v 1.106 2011/10/06 12:26:03 uebayasi Exp $"); #include "opt_uvmhist.h" #include "opt_readahead.h" @@ -95,7 +95,7 @@ uvm_pager_realloc_emerg(void) KASSERT(!emerginuse); new_emergva = uvm_km_alloc(kernel_map, - round_page(MAXPHYS) + ptoa(uvmexp.ncolors), 0, + round_page(MAXPHYS) + ptoa(uvmexp.ncolors), ptoa(uvmexp.ncolors), UVM_KMF_VAONLY); KASSERT(new_emergva != 0); @@ -264,6 +264,7 @@ uvm_pagermapout(vaddr_t kva, int npages) if ((kva & ~ptoa(uvmexp.colormask)) == emergva) { mutex_enter(&pager_map_wanted_lock); + KASSERT(emerginuse); emerginuse = false; wakeup(&emergva); mutex_exit(&pager_map_wanted_lock);