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

Reply via email to