Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 25 Mar 2012 06:01:34 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r233454 - head/sys/powerpc/aim
Message-ID:  <201203250601.q2P61Yut066731@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nwhitehorn
Date: Sun Mar 25 06:01:34 2012
New Revision: 233454
URL: http://svn.freebsd.org/changeset/base/233454

Log:
  More PMAP performance improvements: on powerpc64, when TLBIE can be run
  with exceptions enabled, leave them enabled and use a regular mutex to
  guard TLB invalidations instead of a spinlock.

Modified:
  head/sys/powerpc/aim/moea64_native.c

Modified: head/sys/powerpc/aim/moea64_native.c
==============================================================================
--- head/sys/powerpc/aim/moea64_native.c	Sun Mar 25 03:14:31 2012	(r233453)
+++ head/sys/powerpc/aim/moea64_native.c	Sun Mar 25 06:01:34 2012	(r233454)
@@ -138,7 +138,7 @@ __FBSDID("$FreeBSD$");
  * Just to add to the fun, exceptions must be off as well
  * so that we can't trap in 64-bit mode. What a pain.
  */
-struct mtx	tlbie_mutex;
+static struct mtx	tlbie_mutex;
 
 static __inline void
 TLBIE(uint64_t vpn) {
@@ -151,8 +151,8 @@ TLBIE(uint64_t vpn) {
 	vpn <<= ADDR_PIDX_SHFT;
 	vpn &= ~(0xffffULL << 48);
 
-	mtx_lock_spin(&tlbie_mutex);
 #ifdef __powerpc64__
+	mtx_lock(&tlbie_mutex);
 	__asm __volatile("\
 	    ptesync; \
 	    tlbie %0; \
@@ -160,10 +160,13 @@ TLBIE(uint64_t vpn) {
 	    tlbsync; \
 	    ptesync;" 
 	:: "r"(vpn) : "memory");
+	mtx_unlock(&tlbie_mutex);
 #else
 	vpn_hi = (uint32_t)(vpn >> 32);
 	vpn_lo = (uint32_t)vpn;
 
+	/* Note: spin mutex is to disable exceptions while fiddling MSR */
+	mtx_lock_spin(&tlbie_mutex);
 	__asm __volatile("\
 	    mfmsr %0; \
 	    mr %1, %0; \
@@ -181,8 +184,8 @@ TLBIE(uint64_t vpn) {
 	    ptesync;" 
 	: "=r"(msr), "=r"(scratch) : "r"(vpn_hi), "r"(vpn_lo), "r"(32), "r"(1)
 	    : "memory");
-#endif
 	mtx_unlock_spin(&tlbie_mutex);
+#endif
 }
 
 #define DISABLE_TRANS(msr)	msr = mfmsr(); mtmsr(msr & ~PSL_DR)
@@ -413,7 +416,11 @@ moea64_bootstrap_native(mmu_t mmup, vm_o
 	/*
 	 * Initialize the TLBIE lock. TLBIE can only be executed by one CPU.
 	 */
-	mtx_init(&tlbie_mutex, "tlbie mutex", NULL, MTX_SPIN);
+#ifdef __powerpc64__
+	mtx_init(&tlbie_mutex, "tlbie", NULL, MTX_DEF);
+#else
+	mtx_init(&tlbie_mutex, "tlbie", NULL, MTX_SPIN);
+#endif
 
 	moea64_mid_bootstrap(mmup, kernelstart, kernelend);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201203250601.q2P61Yut066731>