Module Name:    src
Committed By:   skrll
Date:           Sun Sep  4 15:21:54 UTC 2016

Modified Files:
        src/sys/arch/mips/mips: pmap_machdep.c

Log Message:
Safely remove non-PV_KENTER pages from pv_list


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/mips/mips/pmap_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/pmap_machdep.c
diff -u src/sys/arch/mips/mips/pmap_machdep.c:1.7 src/sys/arch/mips/mips/pmap_machdep.c:1.8
--- src/sys/arch/mips/mips/pmap_machdep.c:1.7	Sun Sep  4 07:47:12 2016
+++ src/sys/arch/mips/mips/pmap_machdep.c	Sun Sep  4 15:21:54 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap_machdep.c,v 1.7 2016/09/04 07:47:12 skrll Exp $	*/
+/*	$NetBSD: pmap_machdep.c,v 1.8 2016/09/04 15:21:54 skrll Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: pmap_machdep.c,v 1.7 2016/09/04 07:47:12 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap_machdep.c,v 1.8 2016/09/04 15:21:54 skrll Exp $");
 
 /*
  *	Manages physical address maps.
@@ -905,15 +905,19 @@ pmap_md_vca_add(struct vm_page *pg, vadd
 	if (__predict_true(!mips_cache_badalias(pv->pv_va, va))) {
 		return false;
 	}
-	for (pv_entry_t npv = pv; npv; npv = npv->pv_next) {
-		if (npv->pv_va & PV_KENTER)
+	for (pv_entry_t npv = pv; npv && npv->pmap;) {
+		if (npv->pv_va & PV_KENTER) {
+			npv = npv->pv_next)
 			continue;
+		}
 		vaddr_t nva = trunc_page(npv->pv_va);
 		pmap_t npm = npv->pv_pmap;
 		VM_PAGEMD_PVLIST_UNLOCK(mdpg);
 		pmap_remove(npm, nva, nva + PAGE_SIZE);
 		pmap_update(npm);
 		(void)VM_PAGEMD_PVLIST_LOCK(mdpg);
+
+		npv = pv;
 	}
 	return true;
 #else	/* !PMAP_NO_PV_UNCACHED */

Reply via email to