svn commit: r278935 - user/nwhitehorn/ppc64-pmap-rework/aim
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Wed Feb 18 05:20:53 UTC 2015
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);
More information about the svn-src-user
mailing list