svn commit: r279120 - user/nwhitehorn/ppc64-pmap-rework/ps3

Nathan Whitehorn nwhitehorn at FreeBSD.org
Sat Feb 21 23:21:41 UTC 2015


Author: nwhitehorn
Date: Sat Feb 21 23:21:40 2015
New Revision: 279120
URL: https://svnweb.freebsd.org/changeset/base/279120

Log:
  Fix reinsertion of pages into secondary PTE group. Something here is still
  causing instability under high load, but this is a step forward at least.

Modified:
  user/nwhitehorn/ppc64-pmap-rework/ps3/mmu_ps3.c

Modified: user/nwhitehorn/ppc64-pmap-rework/ps3/mmu_ps3.c
==============================================================================
--- user/nwhitehorn/ppc64-pmap-rework/ps3/mmu_ps3.c	Sat Feb 21 23:20:05 2015	(r279119)
+++ user/nwhitehorn/ppc64-pmap-rework/ps3/mmu_ps3.c	Sat Feb 21 23:21:40 2015	(r279120)
@@ -185,15 +185,16 @@ mps3_pte_clear(mmu_t mmu, struct pvo_ent
 	rw_rlock(&mps3_eviction_lock);
 
 	refchg = mps3_pte_synch(mmu, pvo);
-        if (refchg < 0) {
-                rw_runlock(&mps3_eviction_lock);
-                return (refchg);
-        }
+	if (refchg < 0) {
+		rw_runlock(&mps3_eviction_lock);
+		return (refchg);
+	}
 
 	moea64_pte_from_pvo(pvo, &pte);
 
 	pte.pte_lo |= refchg;
 	pte.pte_lo &= ~ptebit;
+	/* XXX: race on RC bits between write and sync. Anything to do? */
 	lv1_write_htab_entry(mps3_vas_id, pvo->pvo_pte.slot, pte.pte_hi,
 	    pte.pte_lo);
 	rw_runlock(&mps3_eviction_lock);
@@ -208,10 +209,11 @@ mps3_pte_unset(mmu_t mmu, struct pvo_ent
 
 	rw_rlock(&mps3_eviction_lock);
 	refchg = mps3_pte_synch(mmu, pvo);
-        if (refchg < 0) {
-                rw_runlock(&mps3_eviction_lock);
-                return (-1);
-        }
+	if (refchg < 0) {
+		moea64_pte_overflow--;
+		rw_runlock(&mps3_eviction_lock);
+		return (-1);
+	}
 	/* XXX: race on RC bits between unset and sync. Anything to do? */
 	lv1_write_htab_entry(mps3_vas_id, pvo->pvo_pte.slot, 0, 0);
 	rw_runlock(&mps3_eviction_lock);
@@ -227,8 +229,13 @@ mps3_pte_insert(mmu_t mmu, struct pvo_en
 	struct lpte pte, evicted;
 	uint64_t index;
 
+	if (pvo->pvo_vaddr & PVO_HID) {
+		/* Hypercall needs primary PTEG */
+		pvo->pvo_vaddr &= ~PVO_HID;
+		pvo->pvo_pte.slot ^= (moea64_pteg_mask << 3);
+	}
+
 	pvo->pvo_pte.slot &= ~7UL;
-	pvo->pvo_vaddr &= ~PVO_HID;
 	moea64_pte_from_pvo(pvo, &pte);
 	evicted.pte_hi = 0;
 	PTESYNC();


More information about the svn-src-user mailing list