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;
}