Daemon News Ezine BSD News BSD Mall BSD Support Forum BSD Advocacy BSD Updates

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

PERFORCE change 90376 for review



http://perforce.freebsd.org/chv.cgi?CH=90376

Change 90376 by alc@alc_home on 2006/01/26 02:10:43

	Merge the rewritten get_pv_entry().  It has to understand superpages.

Affected files ...

.. //depot/projects/superpages/src/sys/amd64/amd64/pmap.c#5 edit

Differences ...

==== //depot/projects/superpages/src/sys/amd64/amd64/pmap.c#5 (text+ko) ====

@@ -1421,7 +1421,7 @@
 	static const struct timeval printinterval = { 60, 0 };
 	static struct timeval lastprint;
 	struct vpgqueues *vpq;
-	pd_entry_t ptepde;
+	pd_entry_t *pde;
 	pmap_t pmap;
 	pt_entry_t *pte, tpte;
 	pv_entry_t allocated_pv, next_pv, pv;
@@ -1461,7 +1461,22 @@
 			else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap))
 				continue;
 			pmap->pm_stats.resident_count--;
-			pte = pmap_pte_pde(pmap, va, &ptepde);
+			pde = pmap_pde(pmap, va);
+			if ((*pde & PG_PS) != 0 &&
+			    !pmap_demote(pmap, pde, va)) {
+				/*
+				 * All mappings within the same 2mpage were
+				 * destroyed and pv was freed.
+				 */
+				if (pmap != locked_pmap)
+					PMAP_UNLOCK(pmap);
+				if (allocated_pv == NULL) {
+					allocated_pv = uma_zalloc(pvzone,
+					    M_NOWAIT);
+				}
+				continue;
+			}
+			pte = pmap_pde_to_pte(pde, va);
 			tpte = pte_load_clear(pte);
 			KASSERT((tpte & PG_W) == 0,
 			    ("get_pv_entry: wired pte %#lx", tpte));
@@ -1480,7 +1495,7 @@
 			if (TAILQ_EMPTY(&m->md.pv_list))
 				vm_page_flag_clear(m, PG_WRITEABLE);
 			m->md.pv_list_count--;
-			pmap_unuse_pt(pmap, va, ptepde);
+			pmap_unuse_pt(pmap, va, *pde);
 			if (pmap != locked_pmap)
 				PMAP_UNLOCK(pmap);
 			if (allocated_pv == NULL)