PERFORCE change 90376 for review
Alan Cox
alc at FreeBSD.org
Wed Jan 25 18:11:05 PST 2006
http://perforce.freebsd.org/chv.cgi?CH=90376
Change 90376 by alc at 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)
More information about the p4-projects
mailing list