Module Name:    src
Committed By:   skrll
Date:           Wed Aug  3 15:59:58 UTC 2016

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

Log Message:
Don't touch pm_onproc at all in pmap_{update,destroy} and adjust KASSERT
to suit.

Update to cover the PMAP_TLB_MAX > 1 case as well while I'm here.


To generate a diff of this commit:
cvs rdiff -u -r1.338 -r1.339 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.338 src/sys/arch/arm/arm32/pmap.c:1.339
--- src/sys/arch/arm/arm32/pmap.c:1.338	Mon Aug  1 18:28:38 2016
+++ src/sys/arch/arm/arm32/pmap.c	Wed Aug  3 15:59:58 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.338 2016/08/01 18:28:38 skrll Exp $	*/
+/*	$NetBSD: pmap.c,v 1.339 2016/08/03 15:59:58 skrll Exp $	*/
 
 /*
  * Copyright 2003 Wasabi Systems, Inc.
@@ -217,7 +217,7 @@
 
 #include <arm/locore.h>
 
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.338 2016/08/01 18:28:38 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.339 2016/08/03 15:59:58 skrll Exp $");
 
 //#define PMAP_DEBUG
 #ifdef PMAP_DEBUG
@@ -5014,24 +5014,45 @@ pmap_remove_all_complete(pmap_t pm)
 	 */
 #ifdef MULTIPROCESSOR
 	// This should be the last CPU with this pmap onproc
-	KASSERT(!kcpuset_isotherset(pm->pm_onproc, cpu_index(curcpu())));
-	if (kcpuset_isset(pm->pm_onproc, cpu_index(curcpu()))) {
-		struct cpu_info * const ci = curcpu();
-		KASSERT(!cpu_intr_p());
-		/*
-		 * The bits in pm_onproc that belong to this
-		 * TLB can be changed while this TLBs lock is
-		 * not held as long as we use atomic ops.
-		 */
-		kcpuset_atomic_clear(pm->pm_onproc, cpu_index(ci));
+//	KASSERT(!kcpuset_isotherset(pm->pm_onproc, cpu_index(curcpu())));
+#if PMAP_TLB_MAX > 1
+	for (u_int i = 0; !kcpuset_iszero(pm->pm_active); i++) {
+		KASSERT(i < pmap_ntlbs);
+		struct pmap_tlb_info * const ti = pmap_tlbs[i];
+#else
+		struct pmap_tlb_info * const ti = &pmap_tlb0_info;
+#endif
+		TLBINFO_LOCK(ti);
+		struct pmap_asid_info * const pai = PMAP_PAI(pm, ti);
+		if (PMAP_PAI_ASIDVALID_P(pai, ti)) {
+			if (kcpuset_isset(pm->pm_onproc, cpu_index(curcpu()))) {
+#if PMAP_TLB_MAX == 1
+				    KASSERT(cpu_tlb_info(ci) == ti);
+
+				    tlb_invalidate_asids(pai->pai_asid,
+					pai->pai_asid);
+#else
+				    if (cpu_tlb_info(ci) == ti) {
+					    tlb_invalidate_asids(pai->pai_asid,
+						pai->pai_asid);
+				    } else {
+					    pm->pm_shootdown_needed = 1;
+				    }
+#endif
+			}
+		}
+		TLBINFO_UNLOCK(ti);
+
+#if PMAP_TLB_MAX > 1
 	}
-	KASSERT(kcpuset_iszero(pm->pm_onproc));
-#endif /* MULTIPROCESSOR */
+#endif
+#else /* MULTIPROCESSOR */
 
 	struct pmap_asid_info * const pai =
 	    PMAP_PAI(pm, cpu_tlb_info(ci));
 
 	tlb_invalidate_asids(pai->pai_asid, pai->pai_asid);
+#endif /* MULTIPROCESSOR */
 }
 #endif
 

Reply via email to