Module Name:    src
Committed By:   skrll
Date:           Sun Mar 14 10:36:46 UTC 2021

Modified Files:
        src/sys/arch/arm/arm32: pmap.c

Log Message:
Sprinkle kpreempt_{dis,en}able ready for when preemption gets turned on.


To generate a diff of this commit:
cvs rdiff -u -r1.425 -r1.426 src/sys/arch/arm/arm32/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/arm/arm32/pmap.c
diff -u src/sys/arch/arm/arm32/pmap.c:1.425 src/sys/arch/arm/arm32/pmap.c:1.426
--- src/sys/arch/arm/arm32/pmap.c:1.425	Mon Feb  1 19:02:28 2021
+++ src/sys/arch/arm/arm32/pmap.c	Sun Mar 14 10:36:46 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.425 2021/02/01 19:02:28 skrll Exp $	*/
+/*	$NetBSD: pmap.c,v 1.426 2021/03/14 10:36:46 skrll Exp $	*/
 
 /*
  * Copyright 2003 Wasabi Systems, Inc.
@@ -192,7 +192,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.425 2021/02/01 19:02:28 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.426 2021/03/14 10:36:46 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -2837,6 +2837,7 @@ pmap_page_remove(struct vm_page_md *md, 
 	UVMHIST_FUNC(__func__);
 	UVMHIST_CALLARGS(maphist, "md %#jx pa %#jx", (uintptr_t)md, pa, 0, 0);
 
+	kpreempt_disable();
 	pmap_acquire_page_lock(md);
 	struct pv_entry **pvp = &SLIST_FIRST(&md->pvh_list);
 	if (*pvp == NULL) {
@@ -2851,6 +2852,8 @@ pmap_page_remove(struct vm_page_md *md, 
 		PMAP_VALIDATE_MD_PAGE(md);
 #endif
 		pmap_release_page_lock(md);
+		kpreempt_enable();
+
 		return;
 	}
 #if defined(PMAP_CACHE_VIPT) && !defined(ARM_MMU_EXTENDED)
@@ -3004,6 +3007,8 @@ pmap_page_remove(struct vm_page_md *md, 
 	}
 	cpu_cpwait();
 #endif /* ARM_MMU_EXTENDED */
+
+	kpreempt_enable();
 }
 
 /*
@@ -3111,6 +3116,7 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
 	if (flags & PMAP_WIRED)
 		nflags |= PVF_WIRED;
 
+	kpreempt_disable();
 	pmap_acquire_pmap_lock(pm);
 
 	/*
@@ -3125,6 +3131,8 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
 	if (l2b == NULL) {
 		if (flags & PMAP_CANFAIL) {
 			pmap_release_pmap_lock(pm);
+			kpreempt_enable();
+
 			error = ENOMEM;
 			goto free_pv;
 		}
@@ -3419,13 +3427,14 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
 #endif
 
 	pmap_release_pmap_lock(pm);
-
+	kpreempt_enable();
 
 	if (old_pv)
 		pool_put(&pmap_pv_pool, old_pv);
 free_pv:
 	if (new_pv)
 		pool_put(&pmap_pv_pool, new_pv);
+
 	return error;
 }
 
@@ -3470,6 +3479,7 @@ pmap_remove(pmap_t pm, vaddr_t sva, vadd
 	/*
 	 * we lock in the pmap => pv_head direction
 	 */
+	kpreempt_disable();
 	pmap_acquire_pmap_lock(pm);
 
 #ifndef ARM_MMU_EXTENDED
@@ -3637,6 +3647,8 @@ pmap_remove(pmap_t pm, vaddr_t sva, vadd
 	}
 
 	pmap_release_pmap_lock(pm);
+	kpreempt_enable();
+
 	SLIST_FOREACH_SAFE(pv, &opv_list, pv_link, npv) {
 		pool_put(&pmap_pv_pool, pv);
 	}
@@ -3709,6 +3721,7 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v
 		     flags);
 	}
 
+	kpreempt_disable();
 	pmap_t kpm = pmap_kernel();
 	pmap_acquire_pmap_lock(kpm);
 	struct l2_bucket * const l2b = pmap_get_l2_bucket(kpm, va);
@@ -3845,6 +3858,8 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v
 			pool_put(&pmap_pv_pool, pv);
 #endif
 	}
+	kpreempt_enable();
+
 	if (pmap_initialized) {
 		UVMHIST_LOG(maphist, "  <-- done (ptep %#jx: %#jx -> %#jx)",
 		    (uintptr_t)ptep, opte, npte, 0);
@@ -3867,6 +3882,7 @@ pmap_kremove(vaddr_t va, vsize_t len)
 	const vaddr_t eva = va + len;
 	pmap_t kpm = pmap_kernel();
 
+	kpreempt_disable();
 	pmap_acquire_pmap_lock(kpm);
 
 	while (va < eva) {
@@ -3931,6 +3947,8 @@ pmap_kremove(vaddr_t va, vsize_t len)
 	}
 	pmap_release_pmap_lock(kpm);
 	cpu_cpwait();
+	kpreempt_enable();
+
 	UVMHIST_LOG(maphist, "  <--- done (%ju mappings removed)",
 	    total_mappings, 0, 0, 0);
 }
@@ -3952,6 +3970,7 @@ pmap_extract_coherency(pmap_t pm, vaddr_
 	u_int l1slot;
 	bool coherent;
 
+	kpreempt_disable();
 	pmap_acquire_pmap_lock(pm);
 
 	l1slot = l1pte_index(va);
@@ -3982,11 +4001,14 @@ pmap_extract_coherency(pmap_t pm, vaddr_
 		if (l2 == NULL ||
 		    (ptep = l2->l2_bucket[L2_BUCKET(l1slot)].l2b_kva) == NULL) {
 			pmap_release_pmap_lock(pm);
+			kpreempt_enable();
+
 			return false;
 		}
 
 		pte = ptep[l2pte_index(va)];
 		pmap_release_pmap_lock(pm);
+		kpreempt_enable();
 
 		if (pte == 0)
 			return false;
@@ -4023,6 +4045,7 @@ pmap_pv_remove(paddr_t pa)
 {
 	struct pmap_page *pp;
 
+	KASSERT(kpreempt_disabled());
 	pp = pmap_pv_tracked(pa);
 	if (pp == NULL)
 		panic("pmap_pv_protect: page not pv-tracked: 0x%"PRIxPADDR,
@@ -4064,6 +4087,7 @@ pmap_protect(pmap_t pm, vaddr_t sva, vad
 		return;
 	}
 
+	kpreempt_disable();
 	pmap_acquire_pmap_lock(pm);
 
 #ifndef ARM_MMU_EXTENDED
@@ -4154,6 +4178,7 @@ pmap_protect(pmap_t pm, vaddr_t sva, vad
 #endif
 
 	pmap_release_pmap_lock(pm);
+	kpreempt_enable();
 }
 
 void
@@ -4364,6 +4389,7 @@ pmap_prefetchabt_fixup(void *v)
 
   out:
 	kpreempt_enable();
+
 	return rv;
 }
 #endif
@@ -4392,6 +4418,7 @@ pmap_fault_fixup(pmap_t pm, vaddr_t va, 
 	    (uintptr_t)PMAP_PAI(pm, cpu_tlb_info(curcpu()))->pai_asid, 0);
 #endif
 
+	kpreempt_disable();
 	pmap_acquire_pmap_lock(pm);
 
 	/*
@@ -4785,6 +4812,7 @@ pmap_fault_fixup(pmap_t pm, vaddr_t va, 
 
 out:
 	pmap_release_pmap_lock(pm);
+	kpreempt_enable();
 
 	return rv;
 }
@@ -4825,6 +4853,7 @@ pmap_unwire(pmap_t pm, vaddr_t va)
 	UVMHIST_FUNC(__func__);
 	UVMHIST_CALLARGS(maphist, "pm %#jx va %#jx", (uintptr_t)pm, va, 0, 0);
 
+	kpreempt_disable();
 	pmap_acquire_pmap_lock(pm);
 
 	l2b = pmap_get_l2_bucket(pm, va);
@@ -4846,6 +4875,7 @@ pmap_unwire(pmap_t pm, vaddr_t va)
 	}
 
 	pmap_release_pmap_lock(pm);
+	kpreempt_enable();
 
 	UVMHIST_LOG(maphist, " <-- done", 0, 0, 0, 0);
 }
@@ -5188,6 +5218,7 @@ pmap_remove_all(pmap_t pm)
 
 	KASSERT(pm != pmap_kernel());
 
+	kpreempt_disable();
 	/*
 	 * The vmspace described by this pmap is about to be torn down.
 	 * Until pmap_update() is called, UVM will only make calls
@@ -5212,6 +5243,7 @@ pmap_remove_all(pmap_t pm)
 	pmap_tlb_asid_release_all(pm);
 #endif
 	pm->pm_remove_all = true;
+	kpreempt_enable();
 
 	UVMHIST_LOG(maphist, " <-- done", 0, 0, 0, 0);
 	return false;

Reply via email to