From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from rere.qmqm.pl (rere.qmqm.pl [84.10.57.10]) by dpdk.org (Postfix) with ESMTP id 73BC22934; Tue, 13 Dec 2016 02:28:34 +0100 (CET) Received: by rere.qmqm.pl (Postfix, from userid 1000) id 03A8B6082; Tue, 13 Dec 2016 02:28:33 +0100 (CET) Message-Id: <3da244231b6868ccc3e70d91dc277df39a3695bd.1481592081.git.mirq-linux@rere.qmqm.pl> From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To: dev@dpdk.org To: test-report@dpdk.org References: <20161213010852.862C4376C@dpdk.org> In-Reply-To: <20161213010852.862C4376C@dpdk.org> Date: Tue, 13 Dec 2016 02:28:33 +0100 (CET) Subject: [dpdk-dev] [PATCH v2 01/13] EAL: count nr_overcommit_hugepages as available X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 13 Dec 2016 01:28:34 -0000 Signed-off-by: Michał Mirosław --- lib/librte_eal/linuxapp/eal/eal_hugepage_info.c | 43 ++++++++++++++++++------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c b/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c index 18858e2..b68f060 100644 --- a/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c +++ b/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c @@ -61,30 +61,38 @@ static const char sys_dir_path[] = "/sys/kernel/mm/hugepages"; +static int get_hp_sysfs_value(const char *subdir, const char *file, unsigned long *val) +{ + char path[PATH_MAX]; + + snprintf(path, sizeof(path), "%s/%s/%s", + sys_dir_path, subdir, file); + return eal_parse_sysfs_value(path, val); +} + /* this function is only called from eal_hugepage_info_init which itself * is only called from a primary process */ static uint32_t get_num_hugepages(const char *subdir) { - char path[PATH_MAX]; - long unsigned resv_pages, num_pages = 0; + unsigned long resv_pages, num_pages, over_pages, surplus_pages; const char *nr_hp_file = "free_hugepages"; const char *nr_rsvd_file = "resv_hugepages"; + const char *nr_over_file = "nr_overcommit_hugepages"; + const char *nr_splus_file = "surplus_hugepages"; /* first, check how many reserved pages kernel reports */ - snprintf(path, sizeof(path), "%s/%s/%s", - sys_dir_path, subdir, nr_rsvd_file); - if (eal_parse_sysfs_value(path, &resv_pages) < 0) + if (get_hp_sysfs_value(subdir, nr_rsvd_file, &resv_pages) < 0) return 0; - snprintf(path, sizeof(path), "%s/%s/%s", - sys_dir_path, subdir, nr_hp_file); - if (eal_parse_sysfs_value(path, &num_pages) < 0) + if (get_hp_sysfs_value(subdir, nr_hp_file, &num_pages) < 0) return 0; - if (num_pages == 0) - RTE_LOG(WARNING, EAL, "No free hugepages reported in %s\n", - subdir); + if (get_hp_sysfs_value(subdir, nr_over_file, &over_pages) < 0) + over_pages = 0; + + if (get_hp_sysfs_value(subdir, nr_splus_file, &surplus_pages) < 0) + surplus_pages = 0; /* adjust num_pages */ if (num_pages >= resv_pages) @@ -92,6 +100,19 @@ get_num_hugepages(const char *subdir) else if (resv_pages) num_pages = 0; + if (over_pages >= surplus_pages) + over_pages -= surplus_pages; + else + over_pages = 0; + + if (num_pages == 0 && over_pages == 0) + RTE_LOG(WARNING, EAL, "No available hugepages reported in %s\n", + subdir); + + num_pages += over_pages; + if (num_pages < over_pages) /* overflow */ + num_pages = UINT32_MAX; + /* we want to return a uint32_t and more than this looks suspicious * anyway ... */ if (num_pages > UINT32_MAX) -- 2.10.2