From owner-svn-src-user@FreeBSD.ORG Wed Feb 18 05:20:53 2015 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 889E11D0; Wed, 18 Feb 2015 05:20:53 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 63613CBF; Wed, 18 Feb 2015 05:20:53 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t1I5Kqca045838; Wed, 18 Feb 2015 05:20:52 GMT (envelope-from nwhitehorn@FreeBSD.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t1I5Kq0M045837; Wed, 18 Feb 2015 05:20:52 GMT (envelope-from nwhitehorn@FreeBSD.org) Message-Id: <201502180520.t1I5Kq0M045837@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: nwhitehorn set sender to nwhitehorn@FreeBSD.org using -f From: Nathan Whitehorn Date: Wed, 18 Feb 2015 05:20:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r278935 - user/nwhitehorn/ppc64-pmap-rework/aim X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 Feb 2015 05:20:53 -0000 Author: nwhitehorn Date: Wed Feb 18 05:20:52 2015 New Revision: 278935 URL: https://svnweb.freebsd.org/changeset/base/278935 Log: Optimize reinsertion after evictions and add in some miscellaneous paranoia. Modified: user/nwhitehorn/ppc64-pmap-rework/aim/mmu_oea64.c Modified: user/nwhitehorn/ppc64-pmap-rework/aim/mmu_oea64.c ============================================================================== --- user/nwhitehorn/ppc64-pmap-rework/aim/mmu_oea64.c Wed Feb 18 03:54:54 2015 (r278934) +++ user/nwhitehorn/ppc64-pmap-rework/aim/mmu_oea64.c Wed Feb 18 05:20:52 2015 (r278935) @@ -1248,14 +1248,16 @@ moea64_enter(mmu_t mmu, pmap_t pmap, vm_ oldpvo->pvo_pte.prot == prot) { /* Identical mapping already exists */ error = 0; - if (MOEA64_PTE_SYNCH(mmu, oldpvo) >= 0) { - /* ... and present in page table */ - PV_PAGE_UNLOCK(m); - PMAP_UNLOCK(pmap); - free_pvo_entry(pvo); - break; /* all done */ - } - /* XXX: protection update */ + + /* If not in page table, reinsert it */ + if (MOEA64_PTE_SYNCH(mmu, oldpvo) < 0) + MOEA64_PTE_INSERT(mmu, oldpvo); + + /* Then just clean up and go home */ + PV_PAGE_UNLOCK(m); + PMAP_UNLOCK(pmap); + free_pvo_entry(pvo); + break; } /* Otherwise, need to kill it first */ @@ -1532,10 +1534,8 @@ moea64_is_prefaultable(mmu_t mmu, pmap_t PMAP_LOCK(pmap); pvo = moea64_pvo_find_va(pmap, va & ~ADDR_POFF); - if (pvo != NULL) { - if (MOEA64_PTE_SYNCH(mmu, pvo) >= 0) /* in page table? */ - rv = FALSE; - } + if (pvo != NULL) + rv = FALSE; PMAP_UNLOCK(pmap); return (rv); } @@ -2152,13 +2152,8 @@ moea64_remove_all(mmu_t mmu, vm_page_t m PMAP_UNLOCK(pmap); } - if ((m->aflags & PGA_WRITEABLE) && - (atomic_readandclear_32(&m->md.mdpg_attrs) & LPTE_CHG)) - vm_page_dirty(m); - - vm_page_aflag_clear(m, PGA_WRITEABLE); - vm_page_aflag_clear(m, PGA_EXECUTABLE); KASSERT(!pmap_page_is_mapped(m), ("Page still has mappings")); + KASSERT(!(m->aflags & PGA_WRITEABLE), ("Page still writable")); PV_PAGE_UNLOCK(m); /* Clean up UMA allocations */ @@ -2269,6 +2264,8 @@ moea64_pvo_enter(mmu_t mmu, struct pvo_e static void moea64_pvo_remove_from_pmap(mmu_t mmu, struct pvo_entry *pvo) { + struct vm_page *pg; + int32_t refchg; KASSERT(pvo->pvo_pmap != NULL, ("Trying to remove PVO with no pmap")); PMAP_LOCK_ASSERT(pvo->pvo_pmap, MA_OWNED); @@ -2295,13 +2292,25 @@ moea64_pvo_remove_from_pmap(mmu_t mmu, s * Mark this for the next sweep */ pvo->pvo_vaddr |= PVO_DEAD; + + /* Send RC bits to VM */ + if ((pvo->pvo_vaddr & PVO_MANAGED) && + (pvo->pvo_pte.prot & VM_PROT_WRITE)) { + pg = PHYS_TO_VM_PAGE(pvo->pvo_pte.pa & LPTE_RPGN); + if (pg != NULL) { + refchg = atomic_readandclear_32(&pg->md.mdpg_attrs); + if (refchg & LPTE_CHG) + vm_page_dirty(pg); + if (refchg & LPTE_REF) + vm_page_aflag_set(pg, PGA_REFERENCED); + } + } } static void moea64_pvo_remove_from_page(mmu_t mmu, struct pvo_entry *pvo) { struct vm_page *pg; - int32_t refchg; KASSERT(pvo->pvo_vaddr & PVO_DEAD, ("Trying to delink live page")); @@ -2313,23 +2322,13 @@ moea64_pvo_remove_from_page(mmu_t mmu, s /* * Update vm about page writeability/executability if managed */ + PV_LOCKASSERT(pvo->pvo_pte.pa & LPTE_RPGN); pg = PHYS_TO_VM_PAGE(pvo->pvo_pte.pa & LPTE_RPGN); - PV_PAGE_LOCKASSERT(pg); if ((pvo->pvo_vaddr & PVO_MANAGED) && pg != NULL) { LIST_REMOVE(pvo, pvo_vlink); - if (pvo->pvo_pte.prot & VM_PROT_WRITE) { - /* If page is managed, send RC bits over the fence */ - refchg = atomic_readandclear_32(&pg->md.mdpg_attrs); - if (refchg & LPTE_CHG) - vm_page_dirty(pg); - if (refchg & LPTE_REF) - vm_page_aflag_set(pg, PGA_REFERENCED); - if (LIST_EMPTY(vm_page_to_pvoh(pg))) - vm_page_aflag_clear(pg, PGA_WRITEABLE); - } if (LIST_EMPTY(vm_page_to_pvoh(pg))) - vm_page_aflag_clear(pg, PGA_EXECUTABLE); + vm_page_aflag_clear(pg, PGA_WRITEABLE | PGA_EXECUTABLE); } moea64_pvo_entries--; @@ -2423,7 +2422,7 @@ moea64_clear_bit(mmu_t mmu, vm_page_t m, if (ret > 0 && (ret & ptebit)) count++; } - atomic_clear_32(&m->md.mdpg_attrs, LPTE_REF | LPTE_CHG); + atomic_clear_32(&m->md.mdpg_attrs, ptebit); PV_PAGE_UNLOCK(m); return (count);