From: Olivier Matz Date: Tue, 11 Jun 2013 14:18:07 +0000 (+0200) Subject: mem: fix rte_malloc(SOCKET_ID_ANY), try to allocate on other nodes X-Git-Tag: spdx-start~10949 X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=926edd634e4a2c045056599864775c0a597d97e4;p=dpdk.git mem: fix rte_malloc(SOCKET_ID_ANY), try to allocate on other nodes Before this patch, rte_malloc(SOCKET_ID_ANY) was equivalent to rte_malloc(this_socket). If the user specifies SOCKET_ID_ANY, it means that memory can be allocated on any socket. So fix the behavior of rte_malloc() in order to do that. The current CPU socket is still the default, but if it fails, other sockets are tested. Signed-off-by: Olivier Matz Acked-by: Thomas Monjalon --- diff --git a/lib/librte_malloc/rte_malloc.c b/lib/librte_malloc/rte_malloc.c index 2bdec29985..a30bf4c762 100644 --- a/lib/librte_malloc/rte_malloc.c +++ b/lib/librte_malloc/rte_malloc.c @@ -68,23 +68,43 @@ void rte_free(void *addr) * Allocate memory on specified heap. */ void * -rte_malloc_socket(const char *type, size_t size, unsigned align, int socket) +rte_malloc_socket(const char *type, size_t size, unsigned align, int socket_arg) { struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config; + int socket, i; + void *ret; /* return NULL if size is 0 or alignment is not power-of-2 */ if (size == 0 || !rte_is_power_of_2(align)) return NULL; - if (socket == SOCKET_ID_ANY) + if (socket_arg == SOCKET_ID_ANY) socket = malloc_get_numa_socket(); + else + socket = socket_arg; /* Check socket parameter */ if (socket >= RTE_MAX_NUMA_NODES) return NULL; - return malloc_heap_alloc(&mcfg->malloc_heaps[socket], type, - size, align == 0 ? 1 : align); + ret = malloc_heap_alloc(&mcfg->malloc_heaps[socket], type, + size, align == 0 ? 1 : align); + if (ret != NULL || socket_arg != SOCKET_ID_ANY) + return ret; + + /* try other heaps */ + for (i = 0; i < RTE_MAX_NUMA_NODES; i++) { + /* we already tried this one */ + if (i == socket) + continue; + + ret = malloc_heap_alloc(&mcfg->malloc_heaps[i], type, + size, align == 0 ? 1 : align); + if (ret != NULL) + return ret; + } + + return NULL; } /*