malloc: fix allocation with unknown socket ID
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") Cc: stable@dpdk.org 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>
This commit is contained in:
parent
bb0bd346d5
commit
770d41bf33
lib/eal/common
@ -699,6 +699,26 @@ alloc_unlock:
|
||||
return ret;
|
||||
}
|
||||
|
||||
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)
|
||||
|
@ -33,17 +33,6 @@ struct malloc_heap {
|
||||
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user