PERFORCE change 97665 for review
Kip Macy
kmacy at FreeBSD.org
Tue May 23 05:22:47 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=97665
Change 97665 by kmacy at kmacy_storage:sun4v_work on 2006/05/23 05:21:02
don't lose track of the referenced bit in pmap_enter
only invalidate in pmap_remove if a page is referenced or modified
Affected files ...
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/pmap.c#56 edit
Differences ...
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/pmap.c#56 (text+ko) ====
@@ -169,7 +169,7 @@
#ifdef PMAP_DEBUG
#define KDPRINTF if (pmap_debug) printf
#define DPRINTF \
- if ((PCPU_GET(curpmap)->pm_context != 0) && ((PCPU_GET(cpumask) & PCPU_GET(curpmap)->pm_active)) == 0) \
+ if (PCPU_GET(curpmap) && (PCPU_GET(curpmap)->pm_context != 0) && ((PCPU_GET(cpumask) & PCPU_GET(curpmap)->pm_active)) == 0) \
panic("cpumask(0x%x) & active (0x%x) == 0 pid == %d\n", \
PCPU_GET(cpumask), PCPU_GET(curpmap)->pm_active, curthread->td_proc->p_pid); \
if (pmap_debug) printf
@@ -960,8 +960,8 @@
tte_data |= TTE_KERNEL_MINFLAGS;
- tte_hash_insert(pmap->pm_hash, va, tte_data | TTE_MINFLAGS);
- tsb_set_tte(&pmap->pm_tsb, va, tte_data|TTE_MINFLAGS, pmap->pm_context);
+ tte_hash_insert(pmap->pm_hash, va, tte_data|TTE_MINFLAGS|VTD_REF);
+ tsb_set_tte(&pmap->pm_tsb, va, tte_data|TTE_MINFLAGS|VTD_REF, pmap->pm_context);
invlva = FALSE;
if ((otte_data & ~(VTD_W|VTD_REF)) != tte_data) {
@@ -983,7 +983,6 @@
}
}
}
-
if (invlva)
pmap_invalidate_page(pmap, va, TRUE);
@@ -1167,7 +1166,7 @@
cpumask, (1 << curcpu));
#endif
-#if 0
+#ifdef notyet
if ((active_total = (pmap->pm_tlbactive & ~cpumask)) == 0)
goto done;
@@ -1216,6 +1215,7 @@
if (cleartsb == TRUE)
tsb_clear_tte(&pmap->pm_tsb, va);
+
DPRINTF("pmap_invalidate_page(va=0x%lx)\n", va);
spinlock_enter();
invlpg(va, pmap->pm_context);
@@ -1234,11 +1234,11 @@
cpumask_t active;
#endif
-
if ((eva - sva) == PAGE_SIZE) {
pmap_invalidate_page(pmap, sva, cleartsb);
return;
}
+
if (sva >= eva)
panic("invalidating negative or zero range sva=0x%lx eva=0x%lx", sva, eva);
@@ -1490,7 +1490,8 @@
uint64_t otte_data;
vm_page_t m;
- if ((otte_data = tte_hash_clear_bits(pmap->pm_hash, tva, (VTD_SW_W | VTD_W | VTD_REF))) == 0)
+ if ((otte_data = tte_hash_clear_bits(pmap->pm_hash, tva,
+ (VTD_SW_W|VTD_W|VTD_REF))) == 0)
continue;
if (otte_data & (VTD_SW_W | VTD_W | VTD_REF))
@@ -1509,7 +1510,6 @@
}
}
}
-
if (anychanged)
pmap_invalidate_range(pmap, sva, eva, TRUE);
@@ -1534,7 +1534,6 @@
va += PAGE_SIZE;
m++;
}
-
pmap_invalidate_range(kernel_pmap, sva, va, FALSE);
}
@@ -1557,9 +1556,7 @@
pmap_kremove(va);
va += PAGE_SIZE;
}
-
pmap_invalidate_range(kernel_pmap, sva, va, TRUE);
-
}
/*
@@ -1605,13 +1602,15 @@
if ((tte_data = tte_hash_delete(pmap->pm_hash, tva)) == 0)
continue;
pmap_remove_tte(pmap, tte_data, tva);
- invlva = 1;
+ if (!invlva && (tte_data & (VTD_REF|VTD_W)))
+ invlva = 1;
}
- sched_unpin();
vm_page_unlock_queues();
- if (invlva)
+
+ if (invlva)
pmap_invalidate_range(pmap, start, end, TRUE);
+ sched_unpin();
PMAP_UNLOCK(pmap);
}
@@ -1749,8 +1748,8 @@
}
tte_hash_reset(pmap->pm_hash);
+ pmap_invalidate_all(pmap);
sched_unpin();
- pmap_invalidate_all(pmap);
PMAP_UNLOCK(pmap);
vm_page_unlock_queues();
}
@@ -1815,7 +1814,8 @@
int rv;
pv_entry_t pv, pvf, pvn;
pmap_t pmap;
-
+ tte_t otte_data;
+
rv = 0;
if (m->flags & PG_FICTITIOUS)
return (rv);
@@ -1835,7 +1835,8 @@
pmap = pv->pv_pmap;
PMAP_LOCK(pmap);
- if ((tte_hash_clear_bits(pmap->pm_hash, pv->pv_va, VTD_REF) & VTD_REF) != 0) {
+ otte_data = tte_hash_clear_bits(pmap->pm_hash, pv->pv_va, VTD_REF);
+ if ((otte_data & VTD_REF) != 0) {
pmap_invalidate_page(pmap, pv->pv_va, TRUE);
rv++;
More information about the p4-projects
mailing list