Module Name:    src
Committed By:   ryo
Date:           Mon Jul  9 06:14:38 UTC 2018

Modified Files:
        src/sys/arch/aarch64/aarch64: pmap.c

Log Message:
need locks in pmap_kremove() and pmap_fault_fixup()


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/aarch64/aarch64/pmap.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/aarch64/aarch64/pmap.c
diff -u src/sys/arch/aarch64/aarch64/pmap.c:1.7 src/sys/arch/aarch64/aarch64/pmap.c:1.8
--- src/sys/arch/aarch64/aarch64/pmap.c:1.7	Sun May 20 06:45:00 2018
+++ src/sys/arch/aarch64/aarch64/pmap.c	Mon Jul  9 06:14:38 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.7 2018/05/20 06:45:00 ryo Exp $	*/
+/*	$NetBSD: pmap.c,v 1.8 2018/07/09 06:14:38 ryo Exp $	*/
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.7 2018/05/20 06:45:00 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.8 2018/07/09 06:14:38 ryo Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_ddb.h"
@@ -1514,11 +1514,13 @@ _pmap_remove(struct pmap *pm, vaddr_t va
 	UVMHIST_LOG(pmaphist, "pm=%p, va=%016lx, kremovemode=%d",
 	    pm, va, kremove, 0);
 
+	PM_LOCK(pm);
+
 	ptep = _pmap_pte_lookup(pm, va);
 	if (ptep != NULL) {
 		pte = *ptep;
 		if (!l3pte_valid(pte))
-			return;
+			goto done;
 
 		pa = l3pte_pa(pte);
 
@@ -1541,6 +1543,8 @@ _pmap_remove(struct pmap *pm, vaddr_t va
 			pm->pm_stats.wired_count--;
 		pm->pm_stats.resident_count--;
 	}
+ done:
+	PM_UNLOCK(pm);
 }
 
 void
@@ -1550,14 +1554,10 @@ pmap_remove(struct pmap *pm, vaddr_t sva
 
 	PM_ADDR_CHECK(pm, sva);
 
-	PM_LOCK(pm);
-
 	KASSERT(!IN_KSEG_ADDR(sva));
 
 	for (va = sva; va < eva; va += PAGE_SIZE)
 		_pmap_remove(pm, va, false);
-
-	PM_UNLOCK(pm);
 }
 
 void
@@ -1651,6 +1651,7 @@ pmap_fault_fixup(struct pmap *pm, vaddr_
 	pt_entry_t *ptep, pte;
 	vm_prot_t pmap_prot;
 	paddr_t pa;
+	bool fixed = false;
 
 	UVMHIST_FUNC(__func__);
 	UVMHIST_CALLED(pmaphist);
@@ -1674,25 +1675,27 @@ pmap_fault_fixup(struct pmap *pm, vaddr_
 	}
 #endif
 
+	PM_LOCK(pm);
+
 	ptep = _pmap_pte_lookup(pm, va);
 	if (ptep == NULL) {
 		UVMHIST_LOG(pmaphist, "pte_lookup failure: va=%016lx",
 		    va, 0, 0, 0);
-		return false;
+		goto done;
 	}
 
 	pte = *ptep;
 	if (!l3pte_valid(pte)) {
 		UVMHIST_LOG(pmaphist, "invalid pte: %016llx: va=%016lx",
 		    pte, va, 0, 0);
-		return false;
+		goto done;
 	}
 
 	pa = l3pte_pa(*ptep);
 	pg = PHYS_TO_VM_PAGE(pa);
 	if (pg == NULL) {
 		UVMHIST_LOG(pmaphist, "pg not found: va=%016lx", va, 0, 0, 0);
-		return false;
+		goto done;
 	}
 	md = VM_PAGE_TO_MD(pg);
 
@@ -1722,7 +1725,7 @@ pmap_fault_fixup(struct pmap *pm, vaddr_
 	/* no permission to read/write/execute for this page */
 	if ((pmap_prot & accessprot) != accessprot) {
 		UVMHIST_LOG(pmaphist, "no permission to access", 0, 0, 0, 0);
-		return false;
+		goto done;
 	}
 
 	if ((pte & LX_BLKPAG_AF) && ((pte & LX_BLKPAG_AP) == LX_BLKPAG_AP_RW)) {
@@ -1737,7 +1740,7 @@ pmap_fault_fixup(struct pmap *pm, vaddr_
 			    __func__, va, pte, curlwp->l_md.md_onfault);
 		}
 #endif
-		return false;
+		goto done;
 	}
 	KASSERT(((pte & LX_BLKPAG_AF) == 0) ||
 	    ((pte & LX_BLKPAG_AP) == LX_BLKPAG_AP_RO));
@@ -1776,8 +1779,11 @@ pmap_fault_fixup(struct pmap *pm, vaddr_
 #else
 	aarch64_tlbi_by_va(va);
 #endif
+	fixed = true;
 
-	return true;
+ done:
+	PM_UNLOCK(pm);
+	return fixed;
 }
 
 bool
@@ -1924,7 +1930,7 @@ static void
 pmap_db_pte_print(pt_entry_t pte, int level, void (*pr)(const char *, ...))
 {
 	if (pte == 0) {
-		pr("UNUSED\n");
+		pr(" UNUSED\n");
 
 	} else if (level == 0) {
 		/* L0 pde */
@@ -2089,7 +2095,9 @@ pmap_db_pteinfo(vaddr_t va, void (*pr)(c
 
 	pa = l3pte_pa(pte);
 	pg = PHYS_TO_VM_PAGE(pa);
-	if (pg != NULL) {
+	if (pg == NULL) {
+		pr("No VM_PAGE\n");
+	} else {
 		pg_dump(pg, pr);
 		md = VM_PAGE_TO_MD(pg);
 		pv_dump(md, pr);

Reply via email to