diff options
author | alc <alc@FreeBSD.org> | 2008-04-07 07:38:02 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2008-04-07 07:38:02 +0000 |
commit | f2ea5d48832d293fd02debcd03e5d3c9f3a98726 (patch) | |
tree | e6bd1f632c5c7487acdce714809d3b0b7ec7887e /sys/amd64 | |
parent | 6d3db5778b32c179b5499f160873c71457fb1a56 (diff) | |
download | FreeBSD-src-f2ea5d48832d293fd02debcd03e5d3c9f3a98726.zip FreeBSD-src-f2ea5d48832d293fd02debcd03e5d3c9f3a98726.tar.gz |
Update pmap_page_wired_mappings() so that it counts 2/4MB page mappings.
Diffstat (limited to 'sys/amd64')
-rw-r--r-- | sys/amd64/amd64/pmap.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 0b6204a..cc838b8 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -220,6 +220,7 @@ static void pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); static void pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va); static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va); +static int pmap_pvh_wired_mappings(struct md_page *pvh, int count); static boolean_t pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va); static boolean_t pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, @@ -3673,16 +3674,29 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m) int pmap_page_wired_mappings(vm_page_t m) { - pv_entry_t pv; - pt_entry_t *pte; - pmap_t pmap; int count; count = 0; if ((m->flags & PG_FICTITIOUS) != 0) return (count); + count = pmap_pvh_wired_mappings(&m->md, count); + return (pmap_pvh_wired_mappings(pa_to_pvh(VM_PAGE_TO_PHYS(m)), count)); +} + +/* + * pmap_pvh_wired_mappings: + * + * Return the updated number "count" of managed mappings that are wired. + */ +static int +pmap_pvh_wired_mappings(struct md_page *pvh, int count) +{ + pmap_t pmap; + pt_entry_t *pte; + pv_entry_t pv; + mtx_assert(&vm_page_queue_mtx, MA_OWNED); - TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { + TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) { pmap = PV_PMAP(pv); PMAP_LOCK(pmap); pte = pmap_pte(pmap, pv->pv_va); |