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

Dave Anderson anderson at redhat.com
Thu Apr 6 15:36:50 UTC 2017


Hi Aaron,

This looks good -- queued for crash-7.1.9:

  https://github.com/crash-utility/crash/commit/9578af8191033607db56219b87819bdb49a029ca

Thanks,
  Dave


----- Original Message -----
> 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
> 
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
> 




More information about the Crash-utility mailing list