From 0c3977dd156bbc22e2b64aa7f92de643d33e993a Mon Sep 17 00:00:00 2001 From: "Burakov, Anatoly" Date: Wed, 16 Apr 2014 11:11:12 +0000 Subject: [PATCH] mem: take reserved hugepages into account Some applications reserve hugepages for later use, but DPDK doesn't take reserved pages into account when calculating number of available number of hugepages. This patch adds reading from "resv_hugepages" file in addition to "free_hugepages". Signed-off-by: Anatoly Burakov Acked-by: Thomas Monjalon --- lib/librte_eal/linuxapp/eal/eal_hugepage_info.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c b/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c index ef4cd1d51a..4ffeda5988 100644 --- a/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c +++ b/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c @@ -66,8 +66,16 @@ static int32_t get_num_hugepages(const char *subdir) { char path[PATH_MAX]; - long unsigned num_pages = 0; + long unsigned resv_pages, num_pages = 0; const char *nr_hp_file; + const char *nr_rsvd_file = "resv_hugepages"; + + /* first, check how many reserved pages kernel reports */ + rte_snprintf(path, sizeof(path), "%s/%s/%s", + sys_dir_path, subdir, nr_rsvd_file); + + if (eal_parse_sysfs_value(path, &resv_pages) < 0) + return 0; /* if secondary process, just look at the number of hugepages, * otherwise look at number of free hugepages */ @@ -76,6 +84,8 @@ get_num_hugepages(const char *subdir) else nr_hp_file = "free_hugepages"; + memset(path, 0, sizeof(path)); + rte_snprintf(path, sizeof(path), "%s/%s/%s", sys_dir_path, subdir, nr_hp_file); @@ -86,6 +96,10 @@ get_num_hugepages(const char *subdir) RTE_LOG(WARNING, EAL, "No free hugepages reported in %s\n", subdir); + /* adjust num_pages in case of primary process */ + if (num_pages > 0 && internal_config.process_type == RTE_PROC_PRIMARY) + num_pages -= resv_pages; + return (int32_t)num_pages; } -- 2.20.1