mem: fix rte_malloc(SOCKET_ID_ANY), try to allocate on other nodes
authorOlivier Matz <olivier.matz@6wind.com>
Tue, 11 Jun 2013 14:18:07 +0000 (16:18 +0200)
committerDavid Marchand <david.marchand@6wind.com>
Wed, 26 Feb 2014 10:07:27 +0000 (11:07 +0100)
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 <olivier.matz@6wind.com>
Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
lib/librte_malloc/rte_malloc.c

index 2bdec29..a30bf4c 100644 (file)
@@ -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;
 }
 
 /*