When using rte_malloc() from a control thread, 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")
Cc: stable@dpdk.org
Signed-off-by: Ilyes Ben Hamouda <ilyes.ben_hamouda@6wind.com>
Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
+static unsigned int
+malloc_get_numa_socket(void)
+{
+ const struct internal_config *conf = eal_get_internal_configuration();
+ 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 (conf->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)
void *
malloc_heap_alloc(const char *type, size_t size, int socket_arg,
unsigned int flags, size_t align, size_t bound, bool contig)
char name[RTE_HEAP_NAME_MAX_LEN];
} __rte_cache_aligned;
char name[RTE_HEAP_NAME_MAX_LEN];
} __rte_cache_aligned;
-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);
void *
malloc_heap_alloc(const char *type, size_t size, int socket, unsigned int flags,
size_t align, size_t bound, bool contig);