Module Name: src Committed By: matt Date: Tue Jan 26 21:07:14 UTC 2010
Modified Files: src/sys/arch/mips/mips [matt-nb5-mips64]: vm_machdep.c Log Message: Make sure the kernel pages allocated for vmmapbuf have the same page color. To generate a diff of this commit: cvs rdiff -u -r1.121.6.1.2.5 -r1.121.6.1.2.6 \ src/sys/arch/mips/mips/vm_machdep.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/arch/mips/mips/vm_machdep.c diff -u src/sys/arch/mips/mips/vm_machdep.c:1.121.6.1.2.5 src/sys/arch/mips/mips/vm_machdep.c:1.121.6.1.2.6 --- src/sys/arch/mips/mips/vm_machdep.c:1.121.6.1.2.5 Tue Sep 8 07:46:14 2009 +++ src/sys/arch/mips/mips/vm_machdep.c Tue Jan 26 21:07:14 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: vm_machdep.c,v 1.121.6.1.2.5 2009/09/08 07:46:14 uebayasi Exp $ */ +/* $NetBSD: vm_machdep.c,v 1.121.6.1.2.6 2010/01/26 21:07:14 matt Exp $ */ /* * Copyright (c) 1992, 1993 @@ -80,7 +80,7 @@ #include "opt_coredump.h" #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.121.6.1.2.5 2009/09/08 07:46:14 uebayasi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.121.6.1.2.6 2010/01/26 21:07:14 matt Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -291,6 +291,12 @@ } #endif +static struct evcnt evcnt_vmapbuf = + EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "vmapbuf", "calls"); +static struct evcnt evcnt_vmapbuf_adjustments = + EVCNT_INITIALIZER(EVCNT_TYPE_MISC, &evcnt_vmapbuf, + "vmapbuf", "adjustments"); + /* * Map a user I/O request into kernel virtual address space. */ @@ -302,14 +308,21 @@ vaddr_t kva; /* Kernel VA (new to) */ paddr_t pa; /* physical address */ vsize_t off; + vsize_t coloroff; if ((bp->b_flags & B_PHYS) == 0) panic("vmapbuf"); + evcnt_vmapbuf.ev_count++; uva = mips_trunc_page(bp->b_saveaddr = bp->b_data); + coloroff = uva & ptoa(uvmexp.colormask); + if (coloroff) + evcnt_vmapbuf_adjustments.ev_count++; off = (vaddr_t)bp->b_data - uva; len = mips_round_page(off + len); - kva = uvm_km_alloc(phys_map, len, 0, UVM_KMF_VAONLY | UVM_KMF_WAITVA); + kva = uvm_km_alloc(phys_map, len + coloroff, ptoa(uvmexp.ncolors), + UVM_KMF_VAONLY | UVM_KMF_WAITVA); + kva += coloroff; bp->b_data = (void *)(kva + off); upmap = vm_map_pmap(&bp->b_proc->p_vmspace->vm_map); do { @@ -332,16 +345,18 @@ { vaddr_t kva; vsize_t off; + vsize_t coloroff; if ((bp->b_flags & B_PHYS) == 0) panic("vunmapbuf"); kva = mips_trunc_page(bp->b_data); + coloroff = kva & ptoa(uvmexp.colormask); off = (vaddr_t)bp->b_data - kva; len = mips_round_page(off + len); pmap_remove(vm_map_pmap(phys_map), kva, kva + len); pmap_update(pmap_kernel()); - uvm_km_free(phys_map, kva, len, UVM_KMF_VAONLY); + uvm_km_free(phys_map, kva - coloroff, len + coloroff, UVM_KMF_VAONLY); bp->b_data = bp->b_saveaddr; bp->b_saveaddr = NULL; }