Provide basic hugetlb usage as seen in /proc/meminfo for example: crash> kmem -i PAGES TOTAL PERCENTAGE TOTAL MEM 1931928 7.4 GB ---- FREE 210771 823.3 MB 10% of TOTAL MEM USED 1721157 6.6 GB 89% of TOTAL MEM SHARED 338699 1.3 GB 17% of TOTAL MEM BUFFERS 61676 240.9 MB 3% of TOTAL MEM CACHED 0 0 0% of TOTAL MEM SLAB 34280 133.9 MB 1% of TOTAL MEM TOTAL HUGE 524288 2 GB ---- HUGE FREE 524288 2 GB 100% of TOTAL HUGE TOTAL SWAP 1970175 7.5 GB ---- SWAP USED 30 120 KB 0% of TOTAL SWAP SWAP FREE 1970145 7.5 GB 99% of TOTAL SWAP COMMIT LIMIT 2673995 10.2 GB ---- COMMITTED 2068155 7.9 GB 77% of TOTAL LIMIT Signed-off-by: Aaron Tomlin <atomlin@xxxxxxxxxx> --- help.c | 3 +++ memory.c | 41 +++++++++++++++++++++++++++++++++++------ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/help.c b/help.c index 4ce2e0a..3be7dc4 100644 --- a/help.c +++ b/help.c @@ -5981,6 +5981,9 @@ char *help_kmem[] = { " CACHED 1276196 4.9 GB 64% of TOTAL MEM", " SLAB 120410 470.4 MB 6% of TOTAL MEM", " ", +" TOTAL HUGE 524288 2 GB ----", +" HUGE FREE 524288 2 GB 100% of TOTAL HUGE", +" ", " TOTAL SWAP 2498559 9.5 GB ----", " SWAP USED 81978 320.2 MB 3% of TOTAL SWAP", " SWAP FREE 2416581 9.2 GB 96% of TOTAL SWAP", diff --git a/memory.c b/memory.c index 99ea8be..08b5794 100644 --- a/memory.c +++ b/memory.c @@ -237,7 +237,7 @@ static int vm_area_page_dump(ulong, ulong, ulong, ulong, ulong, struct reference *); static void rss_page_types_init(void); static int dump_swap_info(ulong, ulong *, ulong *); -static int get_hugetlb_total_pages(ulong *); +static int get_hugetlb_total_pages(ulong *, ulong *); static void swap_info_init(void); static char *get_swapdev(ulong, char *); static void fill_swap_info(ulong); @@ -8111,7 +8111,8 @@ dump_kmeminfo(void) long committed; ulong overcommit_kbytes = 0; int overcommit_ratio; - ulong hugetlb_total_pages; + ulong hugetlb_total_pages, hugetlb_total_free_pages = 0; + int done_hugetlb_calc = 0; long nr_file_pages, nr_slab; ulong swapper_space_nrpages; ulong pct; @@ -8319,6 +8320,22 @@ dump_kmeminfo(void) pages_to_size(freelowmem_pages, buf), pct); } + if (get_hugetlb_total_pages(&hugetlb_total_pages, + &hugetlb_total_free_pages)) { + done_hugetlb_calc = 1; + + fprintf(fp, "\n%13s %7ld %11s ----\n", + "TOTAL HUGE", hugetlb_total_pages, + pages_to_size(hugetlb_total_pages, buf)); + pct = hugetlb_total_free_pages ? + (hugetlb_total_free_pages * 100) / + hugetlb_total_pages : 0; + fprintf(fp, "%13s %7ld %11s %3ld%% of TOTAL HUGE\n", + "HUGE FREE", + hugetlb_total_free_pages, + pages_to_size(hugetlb_total_free_pages, buf), pct); + } + /* * get swap data from dump_swap_info(). */ @@ -8347,6 +8364,7 @@ dump_kmeminfo(void) "swap_info[%ld].swap_map at %lx is inaccessible\n", totalused_pages, totalswap_pages); } + /* * Show committed memory */ @@ -8364,7 +8382,7 @@ dump_kmeminfo(void) get_symbol_data("sysctl_overcommit_ratio", sizeof(int), &overcommit_ratio); - if (!get_hugetlb_total_pages(&hugetlb_total_pages)) + if (!done_hugetlb_calc) goto bailout; allowed = ((totalram_pages - hugetlb_total_pages) @@ -15293,19 +15311,21 @@ next_physpage(ulonglong paddr, ulonglong *nextpaddr) } static int -get_hugetlb_total_pages(ulong *nr_total_pages) +get_hugetlb_total_pages(ulong *nr_total_pages, ulong *nr_total_free_pages) { ulong hstate_p, vaddr; int i, len; ulong nr_huge_pages; + ulong free_huge_pages; uint horder; - *nr_total_pages = 0; + *nr_total_pages = *nr_total_free_pages = 0; if (kernel_symbol_exists("hstates")) { if (INVALID_SIZE(hstate) || INVALID_MEMBER(hstate_order) || - INVALID_MEMBER(hstate_nr_huge_pages)) + INVALID_MEMBER(hstate_nr_huge_pages) || + INVALID_MEMBER(hstate_free_huge_pages)) return FALSE; len = get_array_length("hstates", NULL, 0); @@ -15325,7 +15345,12 @@ get_hugetlb_total_pages(ulong *nr_total_pages) KVADDR, &nr_huge_pages, sizeof(ulong), "hstate_nr_huge_pages", FAULT_ON_ERROR); + readmem(vaddr + OFFSET(hstate_free_huge_pages), + KVADDR, &free_huge_pages, sizeof(ulong), + "hstate_free_huge_pages", FAULT_ON_ERROR); + *nr_total_pages += nr_huge_pages * (1 << horder); + *nr_total_free_pages += free_huge_pages * (1 << horder); } } else if (kernel_symbol_exists("nr_huge_pages")) { unsigned long hpage_shift = 21; @@ -15334,8 +15359,12 @@ get_hugetlb_total_pages(ulong *nr_total_pages) hpage_shift = 22; get_symbol_data("nr_huge_pages", sizeof(ulong), &nr_huge_pages); + get_symbol_data("free_huge_pages", + sizeof(ulong), &free_huge_pages); *nr_total_pages = nr_huge_pages * ((1 << hpage_shift) / machdep->pagesize); + *nr_total_free_pages = free_huge_pages * + ((1 << hpage_shift) / machdep->pagesize); } return TRUE; } -- 2.9.3 -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility