Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Feb 2015 05:20:52 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r278935 - user/nwhitehorn/ppc64-pmap-rework/aim
Message-ID:  <201502180520.t1I5Kq0M045837@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201502180520.t1I5Kq0M045837>