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