DPDK patches and discussions
 help / color / mirror / Atom feed
From: Zhigang Lu <zlu@ezchip.com>
To: <dev@dpdk.org>
Subject: [dpdk-dev] [PATCH v3 07/12] memzone: allow multiple pagesizes to be requested
Date: Mon, 6 Jul 2015 16:51:32 +0800	[thread overview]
Message-ID: <1436172698-21749-8-git-send-email-zlu@ezchip.com> (raw)
In-Reply-To: <1436172698-21749-1-git-send-email-zlu@ezchip.com>

This patch extends the memzone allocator to remove the restriction
that prevented callers from specifying multiple page sizes in the
flags argument.

In doing so, we also sanitize the free segment matching logic to get
rid of architecture specific disjunctions (2MB vs 1GB on x86, and 16MB
vs 16GB on PPC), thereby allowing for a broader range of hugepages on
architectures that support it.

Change-Id: Ic3713f61da49629a570fe4de34a8aaf5e2e0a19b
Signed-off-by: Zhigang Lu <zlu@ezchip.com>
---
 lib/librte_eal/common/eal_common_memzone.c | 58 ++++++++++++++----------------
 1 file changed, 27 insertions(+), 31 deletions(-)

diff --git a/lib/librte_eal/common/eal_common_memzone.c b/lib/librte_eal/common/eal_common_memzone.c
index 1ea502b..76bae72 100644
--- a/lib/librte_eal/common/eal_common_memzone.c
+++ b/lib/librte_eal/common/eal_common_memzone.c
@@ -113,7 +113,8 @@ align_phys_boundary(const struct rte_memseg *ms, size_t len, size_t align,
 
 static const struct rte_memzone *
 memzone_reserve_aligned_thread_unsafe(const char *name, size_t len,
-		int socket_id, unsigned flags, unsigned align, unsigned bound)
+		int socket_id, uint64_t size_mask, unsigned align,
+		unsigned bound)
 {
 	struct rte_mem_config *mcfg;
 	unsigned i = 0;
@@ -201,18 +202,7 @@ memzone_reserve_aligned_thread_unsafe(const char *name, size_t len,
 		if ((requested_len + addr_offset) > free_memseg[i].len)
 			continue;
 
-		/* check flags for hugepage sizes */
-		if ((flags & RTE_MEMZONE_2MB) &&
-				free_memseg[i].hugepage_sz == RTE_PGSIZE_1G)
-			continue;
-		if ((flags & RTE_MEMZONE_1GB) &&
-				free_memseg[i].hugepage_sz == RTE_PGSIZE_2M)
-			continue;
-		if ((flags & RTE_MEMZONE_16MB) &&
-				free_memseg[i].hugepage_sz == RTE_PGSIZE_16G)
-			continue;
-		if ((flags & RTE_MEMZONE_16GB) &&
-				free_memseg[i].hugepage_sz == RTE_PGSIZE_16M)
+		if ((size_mask & free_memseg[i].hugepage_sz) == 0)
 			continue;
 
 		/* this segment is the best until now */
@@ -244,16 +234,6 @@ memzone_reserve_aligned_thread_unsafe(const char *name, size_t len,
 
 	/* no segment found */
 	if (memseg_idx == -1) {
-		/*
-		 * If RTE_MEMZONE_SIZE_HINT_ONLY flag is specified,
-		 * try allocating again without the size parameter otherwise -fail.
-		 */
-		if ((flags & RTE_MEMZONE_SIZE_HINT_ONLY)  &&
-		    ((flags & RTE_MEMZONE_1GB) || (flags & RTE_MEMZONE_2MB)
-		|| (flags & RTE_MEMZONE_16MB) || (flags & RTE_MEMZONE_16GB)))
-			return memzone_reserve_aligned_thread_unsafe(name,
-				len, socket_id, 0, align, bound);
-
 		rte_errno = ENOMEM;
 		return NULL;
 	}
@@ -302,13 +282,18 @@ rte_memzone_reserve_thread_safe(const char *name, size_t len,
 {
 	struct rte_mem_config *mcfg;
 	const struct rte_memzone *mz = NULL;
-
-	/* both sizes cannot be explicitly called for */
-	if (((flags & RTE_MEMZONE_1GB) && (flags & RTE_MEMZONE_2MB))
-		|| ((flags & RTE_MEMZONE_16MB) && (flags & RTE_MEMZONE_16GB))) {
-		rte_errno = EINVAL;
-		return NULL;
-	}
+	uint64_t size_mask = 0;
+
+	if (flags & RTE_MEMZONE_2MB)
+		size_mask |= RTE_PGSIZE_2M;
+	if (flags & RTE_MEMZONE_16MB)
+		size_mask |= RTE_PGSIZE_16M;
+	if (flags & RTE_MEMZONE_1GB)
+		size_mask |= RTE_PGSIZE_1G;
+	if (flags & RTE_MEMZONE_16GB)
+		size_mask |= RTE_PGSIZE_16G;
+	if (!size_mask)
+		size_mask = UINT64_MAX;
 
 	/* get pointer to global configuration */
 	mcfg = rte_eal_get_configuration()->mem_config;
@@ -316,7 +301,18 @@ rte_memzone_reserve_thread_safe(const char *name, size_t len,
 	rte_rwlock_write_lock(&mcfg->mlock);
 
 	mz = memzone_reserve_aligned_thread_unsafe(
-		name, len, socket_id, flags, align, bound);
+		name, len, socket_id, size_mask, align, bound);
+
+	/*
+	 * If we failed to allocate the requested page size, and the 
+	 * RTE_MEMZONE_SIZE_HINT_ONLY flag is specified, try allocating
+	 * again.
+	 */
+	if (!mz && rte_errno == ENOMEM && size_mask != UINT64_MAX &&
+	    flags & RTE_MEMZONE_SIZE_HINT_ONLY) {
+		mz = memzone_reserve_aligned_thread_unsafe(
+			name, len, socket_id, UINT64_MAX, align, bound);
+	}
 
 	rte_rwlock_write_unlock(&mcfg->mlock);
 
-- 
2.1.2

  parent reply	other threads:[~2015-07-06  8:53 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-06  8:51 [dpdk-dev] [PATCH v3 00/12] Introducing the TILE-Gx platform Zhigang Lu
2015-07-06  8:51 ` [dpdk-dev] [PATCH v3 01/12] test: limit x86 cpuflags checks to x86 builds Zhigang Lu
2015-07-06 10:53   ` Bruce Richardson
2015-07-07  8:21     ` Tony Lu
2015-07-06  8:51 ` [dpdk-dev] [PATCH v3 02/12] hash: fix compilation on non-X86 platforms Zhigang Lu
2015-07-06 11:15   ` Bruce Richardson
2015-07-07  8:24     ` Tony Lu
2015-07-07 14:52   ` Sanford, Robert
2015-07-08  8:21     ` Tony Lu
2015-07-06  8:51 ` [dpdk-dev] [PATCH v3 03/12] hash: check SSE flags only on x86 builds Zhigang Lu
2015-07-06 15:32   ` Bruce Richardson
2015-07-06  8:51 ` [dpdk-dev] [PATCH v3 04/12] eal: allow empty compile time flags Zhigang Lu
2015-07-06 15:33   ` Bruce Richardson
2015-07-09  0:46   ` Thomas Monjalon
2015-07-09  4:20     ` Tony Lu
2015-07-09  6:49       ` damu
2015-07-06  8:51 ` [dpdk-dev] [PATCH v3 05/12] config: remove RTE_LIBNAME definition Zhigang Lu
2015-07-06 15:34   ` Bruce Richardson
2015-07-06  8:51 ` [dpdk-dev] [PATCH v3 06/12] memzone: refactor rte_memzone_reserve() variants Zhigang Lu
2015-07-09  0:51   ` Thomas Monjalon
2015-07-06  8:51 ` Zhigang Lu [this message]
2015-07-06  8:51 ` [dpdk-dev] [PATCH v3 08/12] mempool: allow config override on element alignment Zhigang Lu
2015-07-06 15:37   ` Bruce Richardson
2015-07-07  9:15     ` Tony Lu
2015-07-07 10:10       ` Bruce Richardson
2015-07-06  8:51 ` [dpdk-dev] [PATCH v3 09/12] tile: add page sizes for TILE-Gx/Mx platforms Zhigang Lu
2015-07-06  8:51 ` [dpdk-dev] [PATCH v3 10/12] tile: initial TILE-Gx support Zhigang Lu
2015-07-06  8:51 ` [dpdk-dev] [PATCH v3 11/12] tile: Add TILE-Gx mPIPE poll mode driver Zhigang Lu
2015-07-06  8:51 ` [dpdk-dev] [PATCH v3 12/12] maintainers: claim responsibility for TILE-Gx platform Zhigang Lu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1436172698-21749-8-git-send-email-zlu@ezchip.com \
    --to=zlu@ezchip.com \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).