From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from rere.qmqm.pl (rere.qmqm.pl [91.227.64.183]) by dpdk.org (Postfix) with ESMTP id 40BE7235 for ; Mon, 25 Feb 2019 21:57:31 +0100 (CET) Received: from remote.user (localhost [127.0.0.1]) by rere.qmqm.pl (Postfix) with ESMTPSA id 447Z3z1XpYz9d; Mon, 25 Feb 2019 21:56:15 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=rere.qmqm.pl; s=1; t=1551128176; bh=07oPpPiQm8n6V7u/4JK7/bzULM7gZqxntug7HKi9GX4=; h=Date:From:Subject:To:Cc:From; b=ZHa6oYmq3QnNSTnVF6VjMJEvXmFI5Uhq282i9YvqpgFp7ovUcVLmG2FJzVpNBkhGs Gcc03FS0crx32jGCYeRCJL/exIfWmRzjgMXCQjAwL6CmAywrngX6nl5a3RWkjiEZPx FwiSP2y1boIbyja6fg7bNjGyuX2L/moJJVQWI7WcME9p6c+bdi34rNf/rF2buUqQsu PT1tb7YnfpX0htGDtibOSBjV5WU+14AqLlQy9Q2Mb1SM3Jg8JguySEt4cXdr2bIStI AcUw54YDjL/jEKN8sbaEVAZ8CvAs/mlthikUskvvcO+DEyhAgG9A9tnvapSfNpM8dO x+LVXws6BW8JQ== X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.100.2 at mail Date: Mon, 25 Feb 2019 21:57:28 +0100 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: dpdk-dev Cc: Thomas Monjalon , Ferruh Yigit Message-Id: <447Z3z1XpYz9d@rere.qmqm.pl> Subject: [dpdk-dev] [PATCH] 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: Mon, 25 Feb 2019 20:57:31 -0000 From: Michał Mirosław With nr_overcommit_hugepages > 0 application may be able to allocate hugepages even when free_hugepages == 0. Take this into account when counting available hugepages. Signed-off-by: Michał Mirosław --- .../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 0eab1cf71..ce3e99256 100644 --- a/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c +++ b/lib/librte_eal/linuxapp/eal/eal_hugepage_info.c @@ -70,30 +70,38 @@ create_shared_memory(const char *filename, const size_t mem_size) return map_shared_memory(filename, mem_size, O_RDWR | O_CREAT); } +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) @@ -101,6 +109,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.20.1