svn commit: r195016 - user/kmacy/releng_7_2_fcs/sys/amd64/amd64

Kip Macy kmacy at FreeBSD.org
Fri Jun 26 00:03:11 UTC 2009


Author: kmacy
Date: Fri Jun 26 00:03:10 2009
New Revision: 195016
URL: http://svn.freebsd.org/changeset/base/195016

Log:
  add passing of free list to additional places - free_pv_entry is called with the pmap lock held

Modified:
  user/kmacy/releng_7_2_fcs/sys/amd64/amd64/pmap.c

Modified: user/kmacy/releng_7_2_fcs/sys/amd64/amd64/pmap.c
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/amd64/amd64/pmap.c	Thu Jun 25 23:59:23 2009	(r195015)
+++ user/kmacy/releng_7_2_fcs/sys/amd64/amd64/pmap.c	Fri Jun 26 00:03:10 2009	(r195016)
@@ -239,12 +239,14 @@ struct msgbuf *msgbufp = 0;
  */
 static caddr_t crashdumpmap;
 
-static void	free_pv_entry(pmap_t pmap, pv_entry_t pv);
+static void	free_pv_entry(pmap_t pmap, pv_entry_t pv, vm_page_t *free);
 static pv_entry_t get_pv_entry(pmap_t locked_pmap, int try);
 static void	pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa);
 static boolean_t pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa);
-static void	pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa);
-static void	pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va);
+static void	pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
+	vm_page_t *free);
+static void	pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va,
+	vm_page_t *free);
 static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap,
 		    vm_offset_t va);
 
@@ -256,7 +258,8 @@ static vm_page_t pmap_enter_quick_locked
 static void pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte);
 static boolean_t pmap_is_modified_pvh(struct md_page *pvh);
 static vm_page_t pmap_lookup_pt_page(pmap_t pmap, vm_offset_t va);
-static void pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va);
+static void pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va,
+	vm_page_t *free);
 static boolean_t pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva,
     vm_prot_t prot);
 static int pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva,
@@ -267,7 +270,7 @@ static void pmap_remove_pt_page(pmap_t p
 static void pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde,
     vm_page_t *free);
 static void pmap_remove_entry(struct pmap *pmap, vm_page_t m,
-		vm_offset_t va);
+    vm_offset_t va, vm_page_t *free);
 static void pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m);
 static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va,
     vm_page_t m);
@@ -1981,16 +1984,16 @@ pmap_collect(pmap_t locked_pmap, struct 
 			free = NULL;
 			pmap_unuse_pt(pmap, va, *pde, &free);
 			pmap_invalidate_page(pmap, va);
-			pmap_free_zero_pages(free);
 			TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
 			if (TAILQ_EMPTY(&m->md.pv_list)) {
 				pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
 				if (TAILQ_EMPTY(&pvh->pv_list))
 					vm_page_flag_clear(m, PG_WRITEABLE);
 			}
-			free_pv_entry(pmap, pv);
+			free_pv_entry(pmap, pv, &free);
 			if (pmap != locked_pmap)
 				PMAP_UNLOCK(pmap);
+			pmap_free_zero_pages(free);
 		}
 		vm_page_unlock(m);
 	}
@@ -2002,7 +2005,7 @@ pmap_collect(pmap_t locked_pmap, struct 
  * free the pv_entry back to the free list
  */
 static void
-free_pv_entry(pmap_t pmap, pv_entry_t pv)
+free_pv_entry(pmap_t pmap, pv_entry_t pv, vm_page_t *free)
 {
 	vm_page_t m;
 	struct pv_chunk *pc;
@@ -2036,7 +2039,7 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv
 	KASSERT(m->wire_count == 1, ("wire_count == %d", m->wire_count));
 	m->wire_count = 0;
 	atomic_subtract_int(&cnt.v_wire_count, 1);
-	vm_page_free(m);
+	pmap_add_delayed_free_list(m, free, FALSE);
 }
 
 /*
@@ -2195,7 +2198,8 @@ pmap_pv_demote_pde(pmap_t pmap, vm_offse
  * for the 2MB page mapping.
  */
 static void
-pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa)
+pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
+	vm_page_t *free)
 {
 	struct md_page *pvh;
 	pv_entry_t pv;
@@ -2224,7 +2228,7 @@ pmap_pv_promote_pde(pmap_t pmap, vm_offs
 	do {
 		m++;
 		va += PAGE_SIZE;
-		pmap_pvh_free(&m->md, pmap, va);
+		pmap_pvh_free(&m->md, pmap, va, free);
 	} while (va < va_last);
 }
 
@@ -2234,22 +2238,22 @@ pmap_pv_promote_pde(pmap_t pmap, vm_offs
  * page mappings.
  */
 static void
-pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
+pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va, vm_page_t *free)
 {
 	pv_entry_t pv;
 
 	pv = pmap_pvh_remove(pvh, pmap, va);
 	KASSERT(pv != NULL, ("pmap_pvh_free: pv not found"));
-	free_pv_entry(pmap, pv);
+	free_pv_entry(pmap, pv, free);
 }
 
 static void
-pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va)
+pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va, vm_page_t *free)
 {
 	struct md_page *pvh;
 
 	vm_page_lock_assert(m, MA_OWNED);
-	pmap_pvh_free(&m->md, pmap, va);
+	pmap_pvh_free(&m->md, pmap, va, free);
 	if (TAILQ_EMPTY(&m->md.pv_list)) {
 		pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
 		if (TAILQ_EMPTY(&pvh->pv_list))
@@ -2425,7 +2429,7 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t 
 	if (oldpde & PG_MANAGED) {
 		PA_LOCK_ASSERT(oldpde & PG_PS_FRAME, MA_OWNED);
 		pvh = pa_to_pvh(oldpde & PG_PS_FRAME);
-		pmap_pvh_free(pvh, pmap, sva);
+		pmap_pvh_free(pvh, pmap, sva, free);
 		eva = sva + NBPDR;
 		for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
 		    va < eva; va += PAGE_SIZE, m++) {
@@ -2495,7 +2499,7 @@ pmap_remove_pte(pmap_t pmap, pt_entry_t 
 			vm_page_dirty(m);
 		if (oldpte & PG_A)
 			vm_page_flag_set(m, PG_REFERENCED);
-		pmap_remove_entry(pmap, m, va);
+		pmap_remove_entry(pmap, m, va, free);
 		vm_page_unlock(m);
 	}
 	return (ret);
@@ -2727,7 +2731,7 @@ pmap_remove_all(vm_page_t m)
 		pmap_unuse_pt(pmap, pv->pv_va, *pde, &free);
 		pmap_invalidate_page(pmap, pv->pv_va);
 		TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
-		free_pv_entry(pmap, pv);
+		free_pv_entry(pmap, pv, &free);
 		PMAP_UNLOCK(pmap);
 	}
 	vm_page_flag_clear(m, PG_WRITEABLE);
@@ -2924,7 +2928,8 @@ retry:
  * identical characteristics. 
  */
 static void
-pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va)
+pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va,
+	vm_page_t *free)
 {
 	pd_entry_t newpde;
 	pt_entry_t *firstpte, oldpte, pa, *pte;
@@ -3011,7 +3016,7 @@ setpte:
 	 * Promote the pv entries.
 	 */
 	if ((newpde & PG_MANAGED) != 0)
-		pmap_pv_promote_pde(pmap, va, newpde & PG_PS_FRAME);
+		pmap_pv_promote_pde(pmap, va, newpde & PG_PS_FRAME, free);
 
 	/*
 	 * Propagate the PAT index to its proper position.
@@ -3128,7 +3133,7 @@ restart:
 		if (origpte & PG_MANAGED) {
 			om = PHYS_TO_VM_PAGE(opa);
 			vm_page_lock_assert(om, MA_OWNED);
-			pmap_remove_entry(pmap, om, va);
+			pmap_remove_entry(pmap, om, va, &free);
 			if (origpte & PG_A)
 				vm_page_flag_set(om, PG_REFERENCED);
 			if ((origpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
@@ -3221,7 +3226,7 @@ validate:
 	 */
 	if ((mpte == NULL || mpte->wire_count == NPTEPG) &&
 	    pg_ps_enabled && vm_reserv_level_iffullpop(m) == 0)
-		pmap_promote_pde(pmap, pde, va);
+		pmap_promote_pde(pmap, pde, va, &free);
 
 	PA_UNLOCK(pa);
 	PMAP_UNLOCK(pmap);


More information about the svn-src-user mailing list