Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/arm/arm32 Don't touch pm_onproc at all in pmap_{upd...
details: https://anonhg.NetBSD.org/src/rev/74e4b5727fe8
branches: trunk
changeset: 816936:74e4b5727fe8
user: skrll <skrll%NetBSD.org@localhost>
date: Wed Aug 03 15:59:58 2016 +0000
description:
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.
diffstat:
sys/arch/arm/arm32/pmap.c | 51 +++++++++++++++++++++++++++++++++-------------
1 files changed, 36 insertions(+), 15 deletions(-)
diffs (77 lines):
diff -r 836b87aa1e3b -r 74e4b5727fe8 sys/arch/arm/arm32/pmap.c
--- a/sys/arch/arm/arm32/pmap.c Wed Aug 03 15:24:28 2016 +0000
+++ b/sys/arch/arm/arm32/pmap.c Wed Aug 03 15:59:58 2016 +0000
@@ -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 @@
*/
#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_iszero(pm->pm_onproc));
-#endif /* MULTIPROCESSOR */
+// 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
+ }
+#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
Home |
Main Index |
Thread Index |
Old Index