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 <[email protected]>
---
 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
[email protected]
https://www.redhat.com/mailman/listinfo/crash-utility

Reply via email to