Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 6 Jul 2012 06:42:25 +0000 (UTC)
From:      Alan Cox <alc@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r238163 - head/sys/amd64/amd64
Message-ID:  <201207060642.q666gPBS044259@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: alc
Date: Fri Jul  6 06:42:25 2012
New Revision: 238163
URL: http://svn.freebsd.org/changeset/base/238163

Log:
  Make pmap_enter()'s management of PV entries consistent with the other pmap
  functions that manage PV entries.  Specifically, remove the PV entry from
  the containing PV list only after the corresponding PTE is destroyed.
  
  Update the pmap's wired mapping count in pmap_enter() before the PV list
  lock is acquired.

Modified:
  head/sys/amd64/amd64/pmap.c

Modified: head/sys/amd64/amd64/pmap.c
==============================================================================
--- head/sys/amd64/amd64/pmap.c	Fri Jul  6 03:56:45 2012	(r238162)
+++ head/sys/amd64/amd64/pmap.c	Fri Jul  6 06:42:25 2012	(r238163)
@@ -3517,8 +3517,6 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 		goto validate;
 	} 
 
-	pv = NULL;
-
 	/*
 	 * Mapping has changed, invalidate old range and fall through to
 	 * handle validating new mapping.
@@ -3526,11 +3524,8 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 	if (opa) {
 		if (origpte & PG_W)
 			pmap->pm_stats.wired_count--;
-		if (origpte & PG_MANAGED) {
+		if ((origpte & PG_MANAGED) != 0)
 			om = PHYS_TO_VM_PAGE(opa);
-			CHANGE_PV_LIST_LOCK_TO_VM_PAGE(&lock, om);
-			pv = pmap_pvh_remove(&om->md, pmap, va);
-		}
 		if (mpte != NULL) {
 			mpte->wire_count--;
 			KASSERT(mpte->wire_count > 0,
@@ -3541,22 +3536,20 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 		pmap_resident_count_inc(pmap, 1);
 
 	/*
+	 * Increment the counters.
+	 */
+	if (wired)
+		pmap->pm_stats.wired_count++;
+
+	/*
 	 * Enter on the PV list if part of our managed memory.
 	 */
 	if ((newpte & PG_MANAGED) != 0) {
-		if (pv == NULL)
-			pv = get_pv_entry(pmap, &lock);
-		CHANGE_PV_LIST_LOCK_TO_VM_PAGE(&lock, m);
+		pv = get_pv_entry(pmap, &lock);
 		pv->pv_va = va;
+		CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, pa);
 		TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
-	} else if (pv != NULL)
-		free_pv_entry(pmap, pv);
-
-	/*
-	 * Increment counters
-	 */
-	if (wired)
-		pmap->pm_stats.wired_count++;
+	}
 
 validate:
 
@@ -3586,9 +3579,11 @@ validate:
 				if ((newpte & PG_RW) == 0)
 					invlva = TRUE;
 			}
-			if ((om->aflags & PGA_WRITEABLE) != 0) {
-				CHANGE_PV_LIST_LOCK_TO_VM_PAGE(&lock, om);
-				if (TAILQ_EMPTY(&om->md.pv_list) &&
+			if (opa != pa && (origpte & PG_MANAGED) != 0) {
+				CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, opa);
+				pmap_pvh_free(&om->md, pmap, va);
+				if ((om->aflags & PGA_WRITEABLE) != 0 &&
+				    TAILQ_EMPTY(&om->md.pv_list) &&
 				    ((om->flags & PG_FICTITIOUS) != 0 ||
 				    TAILQ_EMPTY(&pa_to_pvh(opa)->pv_list)))
 					vm_page_aflag_clear(om, PGA_WRITEABLE);



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