Date: Sat, 21 Feb 2015 23:21:41 +0000 (UTC) From: Nathan Whitehorn <nwhitehorn@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r279120 - user/nwhitehorn/ppc64-pmap-rework/ps3 Message-ID: <201502212321.t1LNLf2K039270@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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();
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201502212321.t1LNLf2K039270>