patches for DPDK stable branches
 help / color / mirror / Atom feed
From: Ilyes Ben Hamouda <ilyes.ben_hamouda@6wind.com>
To: stable@dpdk.org
Cc: Ilyes Ben Hamouda <ilyes.ben_hamouda@6wind.com>,
	Olivier Matz <olivier.matz@6wind.com>,
	David Marchand <david.marchand@redhat.com>
Subject: [PATCH 19.11] malloc: fix allocation with unknown socket ID
Date: Fri, 10 Dec 2021 11:33:34 +0100	[thread overview]
Message-ID: <20211210103334.17943-1-ilyes.ben_hamouda@6wind.com> (raw)

[ upstream commit 770d41bf33090462319c765c86a4c1979dc2a148 ]

When using rte_malloc() from a thread which is not bound to a numa
socket (the typical case is a control thread, but it can also happen
on a dataplane thread if its cpu affinity is on cores attached to
several sockets), the used heap is the one from numa socket 0, which
may not have available memory.

Fix this by selecting the first socket which has available memory.

Note: malloc_get_numa_socket() is only used from one .c file, so move
it there, and remove the inline keyword.

Fixes: b94580d6887e ("malloc: avoid unknown socket id")

Signed-off-by: Ilyes Ben Hamouda <ilyes.ben_hamouda@6wind.com>
Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
Acked-by: David Marchand <david.marchand@redhat.com>
---
 lib/librte_eal/common/malloc_heap.c | 19 +++++++++++++++++++
 lib/librte_eal/common/malloc_heap.h | 11 -----------
 2 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/lib/librte_eal/common/malloc_heap.c b/lib/librte_eal/common/malloc_heap.c
index bd5065698d..90a46767ea 100644
--- a/lib/librte_eal/common/malloc_heap.c
+++ b/lib/librte_eal/common/malloc_heap.c
@@ -691,6 +691,25 @@ malloc_heap_alloc_on_heap_id(const char *type, size_t size,
 	return ret;
 }
 
+static unsigned int
+malloc_get_numa_socket(void)
+{
+	unsigned int socket_id = rte_socket_id();
+	unsigned int idx;
+
+	if (socket_id != (unsigned int)SOCKET_ID_ANY)
+		return socket_id;
+
+	/* for control threads, return first socket where memory is available */
+	for (idx = 0; idx < rte_socket_count(); idx++) {
+		socket_id = rte_socket_id_by_idx(idx);
+		if (internal_config.socket_mem[socket_id] != 0)
+			return socket_id;
+	}
+
+	return rte_socket_id_by_idx(0);
+}
+
 void *
 malloc_heap_alloc(const char *type, size_t size, int socket_arg,
 		unsigned int flags, size_t align, size_t bound, bool contig)
diff --git a/lib/librte_eal/common/malloc_heap.h b/lib/librte_eal/common/malloc_heap.h
index 772736b53f..dfd57e6a56 100644
--- a/lib/librte_eal/common/malloc_heap.h
+++ b/lib/librte_eal/common/malloc_heap.h
@@ -37,17 +37,6 @@ struct malloc_heap {
 extern "C" {
 #endif
 
-static inline unsigned
-malloc_get_numa_socket(void)
-{
-	unsigned socket_id = rte_socket_id();
-
-	if (socket_id == (unsigned)SOCKET_ID_ANY)
-		return 0;
-
-	return socket_id;
-}
-
 void *
 malloc_heap_alloc(const char *type, size_t size, int socket, unsigned int flags,
 		size_t align, size_t bound, bool contig);
-- 
2.30.2


                 reply	other threads:[~2021-12-14 13:36 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=20211210103334.17943-1-ilyes.ben_hamouda@6wind.com \
    --to=ilyes.ben_hamouda@6wind.com \
    --cc=david.marchand@redhat.com \
    --cc=olivier.matz@6wind.com \
    --cc=stable@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).