From 96e5109430a5e82bf082244ecc4942d9e93be19a Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Sun, 14 Aug 2005 20:02:50 +0000 Subject: Simplify the page table page reference counting by pmap_enter()'s change of mapping case. Eliminate a stale comment from pmap_enter(). Reviewed by: tegge --- sys/amd64/amd64/pmap.c | 17 ++++++++--------- sys/i386/i386/pmap.c | 14 +++++++------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index e45f2561e137..d9ead4ca70ce 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -1820,7 +1820,6 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, vm_paddr_t pa; register pt_entry_t *pte; vm_paddr_t opa; - pd_entry_t ptepde; pt_entry_t origpte, newpte; vm_page_t mpte, om; @@ -1855,7 +1854,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, } #endif - pte = pmap_pte_pde(pmap, va, &ptepde); + pte = pmap_pte(pmap, va); /* * Page Directory table entry not valid, we need a new PT page @@ -1915,23 +1914,23 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, * handle validating new mapping. */ if (opa) { - int err; if (origpte & PG_W) pmap->pm_stats.wired_count--; if (origpte & PG_MANAGED) { om = PHYS_TO_VM_PAGE(opa); pmap_remove_entry(pmap, om, va); } - err = pmap_unuse_pt(pmap, va, ptepde); - if (err) - panic("pmap_enter: pte vanished, va: 0x%lx", va); + if (mpte != NULL) { + mpte->wire_count--; + KASSERT(mpte->wire_count > 0, + ("pmap_enter: missing reference to page table page," + " va: 0x%lx", va)); + } } else pmap->pm_stats.resident_count++; /* - * Enter on the PV list if part of our managed memory. Note that we - * raise IPL while manipulating pv_table since pmap_enter can be - * called at interrupt time. + * Enter on the PV list if part of our managed memory. */ if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) { pmap_insert_entry(pmap, va, m); diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index e5ad5fa312b0..84e5bd5b08c9 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -1954,23 +1954,23 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, * handle validating new mapping. */ if (opa) { - int err; if (origpte & PG_W) pmap->pm_stats.wired_count--; if (origpte & PG_MANAGED) { om = PHYS_TO_VM_PAGE(opa); pmap_remove_entry(pmap, om, va); } - err = pmap_unuse_pt(pmap, va); - if (err) - panic("pmap_enter: pte vanished, va: 0x%x", va); + if (mpte != NULL) { + mpte->wire_count--; + KASSERT(mpte->wire_count > 0, + ("pmap_enter: missing reference to page table page," + " va: 0x%x", va)); + } } else pmap->pm_stats.resident_count++; /* - * Enter on the PV list if part of our managed memory. Note that we - * raise IPL while manipulating pv_table since pmap_enter can be - * called at interrupt time. + * Enter on the PV list if part of our managed memory. */ if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) { pmap_insert_entry(pmap, va, m); -- cgit v1.3