svn commit: r211215 - head/sys/mips/mips

Jayachandran C. jchandra at FreeBSD.org
Thu Aug 12 09:03:21 UTC 2010


Author: jchandra
Date: Thu Aug 12 09:03:21 2010
New Revision: 211215
URL: http://svn.freebsd.org/changeset/base/211215

Log:
  Re-arrange the pmap calls that use smp_rendezvous() on SMP, so that their
  per-cpu variants are also available to be called.  The per-cpu variants
  are needed for some later optimizations.
  
  Also remove unnecessary casts, do some style fixes.
  
  Reviewed by:	alc, neel

Modified:
  head/sys/mips/mips/pmap.c

Modified: head/sys/mips/mips/pmap.c
==============================================================================
--- head/sys/mips/mips/pmap.c	Thu Aug 12 08:39:54 2010	(r211214)
+++ head/sys/mips/mips/pmap.c	Thu Aug 12 09:03:21 2010	(r211215)
@@ -173,7 +173,6 @@ static void pmap_pvh_free(struct md_page
 static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap,
     vm_offset_t va);
 static __inline void pmap_changebit(vm_page_t m, int bit, boolean_t setem);
-
 static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va,
     vm_page_t m, vm_prot_t prot, vm_page_t mpte);
 static int pmap_remove_pte(struct pmap *pmap, pt_entry_t *ptq, vm_offset_t va);
@@ -181,7 +180,8 @@ static void pmap_remove_page(struct pmap
 static void pmap_remove_entry(struct pmap *pmap, vm_page_t m, vm_offset_t va);
 static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_page_t mpte,
     vm_offset_t va, vm_page_t m);
-static __inline void pmap_invalidate_page(pmap_t pmap, vm_offset_t va);
+static void pmap_invalidate_all(pmap_t pmap);
+static void pmap_invalidate_page(pmap_t pmap, vm_offset_t va);
 static int _pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m);
 
 static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags);
@@ -592,61 +592,100 @@ pmap_nw_modified(pt_entry_t pte)
 	else
 		return (0);
 }
-
 #endif
 
+static __inline void
+pmap_invalidate_all_local(pmap_t pmap)
+{
+
+	if (pmap == kernel_pmap) {
+		tlb_invalidate_all();
+		return;
+	}
+	if (pmap->pm_active & PCPU_GET(cpumask))
+		tlb_invalidate_all_user(pmap);
+	else
+		pmap->pm_asid[PCPU_GET(cpuid)].gen = 0;
+}
+
+#ifdef SMP
 static void
 pmap_invalidate_all(pmap_t pmap)
 {
-#ifdef SMP
-	smp_rendezvous(0, pmap_invalidate_all_action, 0, (void *)pmap);
+
+	smp_rendezvous(0, pmap_invalidate_all_action, 0, pmap);
 }
 
 static void
 pmap_invalidate_all_action(void *arg)
 {
-	pmap_t pmap = (pmap_t)arg;
 
+	pmap_invalidate_all_local((pmap_t)arg);
+}
+#else
+static void
+pmap_invalidate_all(pmap_t pmap)
+{
+
+	pmap_invalidate_all_local(pmap);
+}
 #endif
 
-	if (pmap == kernel_pmap) {
-		tlb_invalidate_all();
+static __inline void
+pmap_invalidate_page_local(pmap_t pmap, vm_offset_t va)
+{
+
+	if (is_kernel_pmap(pmap)) {
+		tlb_invalidate_address(pmap, va);
 		return;
 	}
-
-	if (pmap->pm_active & PCPU_GET(cpumask))
-		tlb_invalidate_all_user(pmap);
-	else
+	if (pmap->pm_asid[PCPU_GET(cpuid)].gen != PCPU_GET(asid_generation))
+		return;
+	else if (!(pmap->pm_active & PCPU_GET(cpumask))) {
 		pmap->pm_asid[PCPU_GET(cpuid)].gen = 0;
+		return;
+	}
+	tlb_invalidate_address(pmap, va);
 }
 
+#ifdef SMP
 struct pmap_invalidate_page_arg {
 	pmap_t pmap;
 	vm_offset_t va;
 };
 
-static __inline void
+static void
 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
 {
-#ifdef SMP
 	struct pmap_invalidate_page_arg arg;
 
 	arg.pmap = pmap;
 	arg.va = va;
-
-	smp_rendezvous(0, pmap_invalidate_page_action, 0, (void *)&arg);
+	smp_rendezvous(0, pmap_invalidate_page_action, 0, &arg);
 }
 
 static void
 pmap_invalidate_page_action(void *arg)
 {
-	pmap_t pmap = ((struct pmap_invalidate_page_arg *)arg)->pmap;
-	vm_offset_t va = ((struct pmap_invalidate_page_arg *)arg)->va;
+	struct pmap_invalidate_page_arg *p = arg;
+
+	pmap_invalidate_page_local(p->pmap, p->va);
+}
+#else
+static void
+pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
+{
 
+	pmap_invalidate_page_local(pmap, va);
+}
 #endif
 
+static __inline void
+pmap_update_page_local(pmap_t pmap, vm_offset_t va, pt_entry_t pte)
+{
+
 	if (is_kernel_pmap(pmap)) {
-		tlb_invalidate_address(pmap, va);
+		tlb_update(pmap, va, pte);
 		return;
 	}
 	if (pmap->pm_asid[PCPU_GET(cpuid)].gen != PCPU_GET(asid_generation))
@@ -655,9 +694,10 @@ pmap_invalidate_page_action(void *arg)
 		pmap->pm_asid[PCPU_GET(cpuid)].gen = 0;
 		return;
 	}
-	tlb_invalidate_address(pmap, va);
+	tlb_update(pmap, va, pte);
 }
 
+#ifdef SMP
 struct pmap_update_page_arg {
 	pmap_t pmap;
 	vm_offset_t va;
@@ -667,36 +707,29 @@ struct pmap_update_page_arg {
 void
 pmap_update_page(pmap_t pmap, vm_offset_t va, pt_entry_t pte)
 {
-#ifdef SMP
 	struct pmap_update_page_arg arg;
 
 	arg.pmap = pmap;
 	arg.va = va;
 	arg.pte = pte;
-
-	smp_rendezvous(0, pmap_update_page_action, 0, (void *)&arg);
+	smp_rendezvous(0, pmap_update_page_action, 0, &arg);
 }
 
 static void
 pmap_update_page_action(void *arg)
 {
-	pmap_t pmap = ((struct pmap_update_page_arg *)arg)->pmap;
-	vm_offset_t va = ((struct pmap_update_page_arg *)arg)->va;
-	pt_entry_t pte = ((struct pmap_update_page_arg *)arg)->pte;
+	struct pmap_update_page_arg *p = arg;
 
-#endif
-	if (is_kernel_pmap(pmap)) {
-		tlb_update(pmap, va, pte);
-		return;
-	}
-	if (pmap->pm_asid[PCPU_GET(cpuid)].gen != PCPU_GET(asid_generation))
-		return;
-	else if (!(pmap->pm_active & PCPU_GET(cpumask))) {
-		pmap->pm_asid[PCPU_GET(cpuid)].gen = 0;
-		return;
-	}
-	tlb_update(pmap, va, pte);
+	pmap_update_page_local(p->pmap, p->va, p->pte);
+}
+#else
+void
+pmap_update_page(pmap_t pmap, vm_offset_t va, pt_entry_t pte)
+{
+
+	pmap_update_page_local(pmap, va, pte);
 }
+#endif
 
 /*
  *	Routine:	pmap_extract


More information about the svn-src-head mailing list