[Crash-utility] [PATCH] kmem: Introduce basic hugetlb usage data with 'kmem -i'

Aaron Tomlin atomlin at redhat.com
Wed Apr 5 15:37:35 UTC 2017


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 at redhat.com>
---
 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




More information about the Crash-utility mailing list