From 1d4e75152b62606d53829dce89faa452e13f977c Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Sun, 6 Oct 2013 22:06:01 -0700 Subject: [PATCH] kernel - Add shared active virtual memory, i386 * Add shared active virtual memory. Shared active real memory represents the amount of memory shared across two or more pmap instances. The memory is counted just once. Shared active virtual memory multiplies that value out by the number of pmap instances the memory is being shared across, giving the sysop some idea of the amount of ram being saved by e.g. shared libraries or shared mmap()s, etc. * Collect statistics on 32-bit systems too. --- sys/platform/pc32/i386/pmap.c | 38 ++++++++++++++++++++++++++++++++ sys/platform/pc32/include/pmap.h | 4 +++- sys/platform/pc64/x86_64/pmap.c | 6 +++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/sys/platform/pc32/i386/pmap.c b/sys/platform/pc32/i386/pmap.c index db9f4b00dc..a4f4a58282 100644 --- a/sys/platform/pc32/i386/pmap.c +++ b/sys/platform/pc32/i386/pmap.c @@ -226,6 +226,40 @@ static void pmap_wait(pmap_t pmap, int count); static unsigned pdir4mb; +static __inline +void +pmap_page_stats_adding(vm_page_t m) +{ + globaldata_t gd = mycpu; + + if (TAILQ_EMPTY(&m->md.pv_list)) { + ++gd->gd_vmtotal.t_arm; + } else if (TAILQ_FIRST(&m->md.pv_list) == + TAILQ_LAST(&m->md.pv_list, md_page_pv_list)) { + ++gd->gd_vmtotal.t_armshr; + ++gd->gd_vmtotal.t_avmshr; + } else { + ++gd->gd_vmtotal.t_avmshr; + } +} + +static __inline +void +pmap_page_stats_deleting(vm_page_t m) +{ + globaldata_t gd = mycpu; + + if (TAILQ_EMPTY(&m->md.pv_list)) { + --gd->gd_vmtotal.t_arm; + } else if (TAILQ_FIRST(&m->md.pv_list) == + TAILQ_LAST(&m->md.pv_list, md_page_pv_list)) { + --gd->gd_vmtotal.t_armshr; + --gd->gd_vmtotal.t_avmshr; + } else { + --gd->gd_vmtotal.t_avmshr; + } +} + /* * Move the kernel virtual free pointer to the next * 4MB. This is used to help improve performance @@ -1914,6 +1948,7 @@ pmap_remove_entry(struct pmap *pmap, vm_page_t m, */ test_m_maps_pv(m, pv); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); + pmap_page_stats_deleting(m); m->md.pv_list_count--; if (m->object) atomic_add_int(&m->object->agg_pv_list_count, -1); @@ -1948,6 +1983,7 @@ pmap_insert_entry(pmap_t pmap, pv_entry_t pv, vm_offset_t va, pv->pv_pmap = pmap; pv->pv_ptem = mpte; + pmap_page_stats_adding(m); TAILQ_INSERT_TAIL(&pmap->pm_pvlist, pv, pv_plist); TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); ++pmap->pm_generation; @@ -2211,6 +2247,7 @@ pmap_remove_all(vm_page_t m) KKASSERT(pv == TAILQ_FIRST(&m->md.pv_list)); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); TAILQ_REMOVE(&pmap->pm_pvlist, pv, pv_plist); + pmap_page_stats_deleting(m); ++pmap->pm_generation; m->md.pv_list_count--; if (m->object) @@ -3166,6 +3203,7 @@ pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) if (m->object) atomic_add_int(&m->object->agg_pv_list_count, -1); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); + pmap_page_stats_deleting(m); if (TAILQ_EMPTY(&m->md.pv_list)) vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE); diff --git a/sys/platform/pc32/include/pmap.h b/sys/platform/pc32/include/pmap.h index 518f0d9140..f168a32039 100644 --- a/sys/platform/pc32/include/pmap.h +++ b/sys/platform/pc32/include/pmap.h @@ -221,9 +221,11 @@ struct vm_page; struct vm_object; struct vmspace; +TAILQ_HEAD(md_page_pv_list, pv_entry); + struct md_page { int pv_list_count; - TAILQ_HEAD(,pv_entry) pv_list; + struct md_page_pv_list pv_list; }; struct md_object { diff --git a/sys/platform/pc64/x86_64/pmap.c b/sys/platform/pc64/x86_64/pmap.c index 5b9c58790c..7138a22d62 100644 --- a/sys/platform/pc64/x86_64/pmap.c +++ b/sys/platform/pc64/x86_64/pmap.c @@ -319,6 +319,9 @@ pmap_page_stats_adding(vm_page_t m) } else if (TAILQ_FIRST(&m->md.pv_list) == TAILQ_LAST(&m->md.pv_list, md_page_pv_list)) { ++gd->gd_vmtotal.t_armshr; + ++gd->gd_vmtotal.t_avmshr; + } else { + ++gd->gd_vmtotal.t_avmshr; } } @@ -333,6 +336,9 @@ pmap_page_stats_deleting(vm_page_t m) } else if (TAILQ_FIRST(&m->md.pv_list) == TAILQ_LAST(&m->md.pv_list, md_page_pv_list)) { --gd->gd_vmtotal.t_armshr; + --gd->gd_vmtotal.t_avmshr; + } else { + --gd->gd_vmtotal.t_avmshr; } } -- 2.41.0