Module Name: src Committed By: matt Date: Thu Sep 1 06:41:38 UTC 2011
Modified Files: src/sys/arch/mips/mips: vm_machdep.c Log Message: Use UVM_KMF_COLORMATCH and switch to pmap_kenter_pa for vmapbuf/vunmapbuf. To generate a diff of this commit: cvs rdiff -u -r1.139 -r1.140 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.139 src/sys/arch/mips/mips/vm_machdep.c:1.140 --- src/sys/arch/mips/mips/vm_machdep.c:1.139 Mon Jun 6 22:04:34 2011 +++ src/sys/arch/mips/mips/vm_machdep.c Thu Sep 1 06:41:38 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: vm_machdep.c,v 1.139 2011/06/06 22:04:34 matt Exp $ */ +/* $NetBSD: vm_machdep.c,v 1.140 2011/09/01 06:41:38 matt Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.139 2011/06/06 22:04:34 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.140 2011/09/01 06:41:38 matt Exp $"); #include "opt_ddb.h" #include "opt_coredump.h" @@ -272,50 +272,38 @@ (void)l; } -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. */ int vmapbuf(struct buf *bp, vsize_t len) { - struct pmap *upmap; - vaddr_t uva; /* User VA (map from) */ 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 + coloroff, ptoa(uvmexp.ncolors), - UVM_KMF_VAONLY | UVM_KMF_WAITVA); - kva += coloroff; + vaddr_t uva = mips_trunc_page(bp->b_data); + const vaddr_t off = (vaddr_t)bp->b_data - uva; + len = mips_round_page(off + len); + + kva = uvm_km_alloc(phys_map, len, atop(uva) & uvmexp.colormask, + UVM_KMF_VAONLY | UVM_KMF_WAITVA | UVM_KMF_COLORMATCH); + KASSERT((atop(kva ^ uva) & uvmexp.colormask) == 0); + bp->b_saveaddr = bp->b_data; bp->b_data = (void *)(kva + off); - upmap = vm_map_pmap(&bp->b_proc->p_vmspace->vm_map); + struct pmap * const upmap = vm_map_pmap(&bp->b_proc->p_vmspace->vm_map); do { + paddr_t pa; /* physical address */ if (pmap_extract(upmap, uva, &pa) == false) panic("vmapbuf: null page frame"); - pmap_enter(vm_map_pmap(phys_map), kva, pa, - VM_PROT_READ | VM_PROT_WRITE, PMAP_WIRED); + pmap_kenter_pa(kva, pa, VM_PROT_READ | VM_PROT_WRITE, + PMAP_WIRED); uva += PAGE_SIZE; kva += PAGE_SIZE; len -= PAGE_SIZE; } while (len); - pmap_update(vm_map_pmap(phys_map)); + pmap_update(pmap_kernel()); return 0; } @@ -327,19 +315,15 @@ vunmapbuf(struct buf *bp, vsize_t len) { 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); + len = mips_round_page((vaddr_t)bp->b_data - kva + len); + pmap_kremove(kva, len); pmap_update(pmap_kernel()); - uvm_km_free(phys_map, kva - coloroff, len + coloroff, UVM_KMF_VAONLY); + uvm_km_free(phys_map, kva, len, UVM_KMF_VAONLY); bp->b_data = bp->b_saveaddr; bp->b_saveaddr = NULL; }