aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Cox <alc@FreeBSD.org>2007-03-27 08:24:47 +0000
committerAlan Cox <alc@FreeBSD.org>2007-03-27 08:24:47 +0000
commit52dc5662071ec69736884f72fef57f73d8fabdfd (patch)
tree3a6095fe08293dac7dd8bcbd8ce83be2439e3f36
parent8048a0798bbd5f30d9c68ee95bd10ced633a54ed (diff)
Notes
-rw-r--r--sys/i386/i386/pmap.c61
1 files changed, 15 insertions, 46 deletions
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index 6eda0a1ae9af..ce8f27ecbd09 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -518,20 +518,6 @@ pmap_init2()
* Low level helper routines.....
***************************************************/
-
-/*
- * this routine defines the region(s) of memory that should
- * not be tested for the modified bit.
- */
-static PMAP_INLINE int
-pmap_track_modified(vm_offset_t va)
-{
- if ((va < kmi.clean_sva) || (va >= kmi.clean_eva))
- return 1;
- else
- return 0;
-}
-
#ifdef SMP
/*
* For SMP, these functions have to use the IPI mechanism for coherence.
@@ -1534,10 +1520,9 @@ pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va)
m = PHYS_TO_VM_PAGE(oldpte);
if (oldpte & PG_M) {
KASSERT((oldpte & PG_RW),
- ("pmap_remove_pte: modified page not writable: va: 0x%x, pte: 0x%x",
- va, oldpte));
- if (pmap_track_modified(va))
- vm_page_dirty(m);
+ ("pmap_remove_pte: modified page not writable: va: %#x, pte: %#jx",
+ va, (uintmax_t)oldpte));
+ vm_page_dirty(m);
}
if (oldpte & PG_A)
vm_page_flag_set(m, PG_REFERENCED);
@@ -1706,10 +1691,9 @@ pmap_remove_all(vm_page_t m)
*/
if (tpte & PG_M) {
KASSERT((tpte & PG_RW),
- ("pmap_remove_all: modified page not writable: va: 0x%x, pte: 0x%x",
- pv->pv_va, tpte));
- if (pmap_track_modified(pv->pv_va))
- vm_page_dirty(m);
+ ("pmap_remove_all: modified page not writable: va: %#x, pte: %#jx",
+ pv->pv_va, (uintmax_t)tpte));
+ vm_page_dirty(m);
}
pmap_invalidate_page(pv->pv_pmap, pv->pv_va);
TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist, pv, pv_plist);
@@ -1793,8 +1777,7 @@ retry:
vm_page_flag_set(m, PG_REFERENCED);
pbits &= ~PG_A;
}
- if ((pbits & PG_M) != 0 &&
- pmap_track_modified(sva)) {
+ if ((pbits & PG_M) != 0) {
if (m == NULL)
m = PHYS_TO_VM_PAGE(*pte);
vm_page_dirty(m);
@@ -1956,6 +1939,8 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
* Enter on the PV list if part of our managed memory.
*/
if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) {
+ KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva,
+ ("pmap_enter: managed mapping within the clean submap"));
pmap_insert_entry(pmap, va, m);
pa |= PG_MANAGED;
}
@@ -1996,10 +1981,9 @@ validate:
}
if (origpte & PG_M) {
KASSERT((origpte & PG_RW),
- ("pmap_enter: modified page not writable: va: 0x%x, pte: 0x%x",
- va, origpte));
- if ((origpte & PG_MANAGED) &&
- pmap_track_modified(va))
+ ("pmap_enter: modified page not writable: va: %#x, pte: %#jx",
+ va, (uintmax_t)origpte));
+ if ((origpte & PG_MANAGED) != 0)
vm_page_dirty(om);
if ((prot & VM_PROT_WRITE) == 0)
invlva = TRUE;
@@ -2030,6 +2014,9 @@ pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
pt_entry_t *pte;
vm_paddr_t pa;
+ KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
+ (m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0,
+ ("pmap_enter_quick: managed mapping within the clean submap"));
mtx_assert(&vm_page_queue_mtx, MA_OWNED);
VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
PMAP_LOCK(pmap);
@@ -2607,13 +2594,6 @@ pmap_is_modified(vm_page_t m)
sched_pin();
mtx_assert(&vm_page_queue_mtx, MA_OWNED);
TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
- /*
- * if the bit being tested is the modified bit, then
- * mark clean_map and ptes as never
- * modified.
- */
- if (!pmap_track_modified(pv->pv_va))
- continue;
PMAP_LOCK(pv->pv_pmap);
pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
rv = (*pte & PG_M) != 0;
@@ -2669,14 +2649,6 @@ pmap_clear_ptes(vm_page_t m, int bit)
* setting RO do we need to clear the VAC?
*/
TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
- /*
- * don't write protect pager mappings
- */
- if (bit == PG_RW) {
- if (!pmap_track_modified(pv->pv_va))
- continue;
- }
-
PMAP_LOCK(pv->pv_pmap);
pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
retry:
@@ -2759,9 +2731,6 @@ pmap_ts_referenced(vm_page_t m)
TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
- if (!pmap_track_modified(pv->pv_va))
- continue;
-
PMAP_LOCK(pv->pv_pmap);
pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);