X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=libringbuffer%2Fshm.c;h=135a2007b0e780221a0aa3cddeffe528a6e54733;hb=4b68c31f1859175d2bd4e1b42f1b7d301e84760f;hp=ea946ea3f5e2a6d2e46d3297ebe925135164272e;hpb=364979886a80f7c993b3210af48a93f7d65f4530;p=lttng-ust.git diff --git a/libringbuffer/shm.c b/libringbuffer/shm.c index ea946ea3..135a2007 100644 --- a/libringbuffer/shm.c +++ b/libringbuffer/shm.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -243,18 +244,33 @@ alloc_error: struct shm_object *shm_object_table_alloc(struct shm_object_table *table, size_t memory_map_size, enum shm_object_type type, - int stream_fd) + int stream_fd, + int cpu) { + int oldnode, node; + struct shm_object *shm_object; + + oldnode = numa_preferred(); + if (cpu >= 0) { + node = numa_node_of_cpu(cpu); + if (node >= 0) + numa_set_preferred(node); + } + if (cpu < 0 || node < 0) + numa_set_localalloc(); switch (type) { case SHM_OBJECT_SHM: - return _shm_object_table_alloc_shm(table, memory_map_size, + shm_object = _shm_object_table_alloc_shm(table, memory_map_size, stream_fd); + break; case SHM_OBJECT_MEM: - return _shm_object_table_alloc_mem(table, memory_map_size); + shm_object = _shm_object_table_alloc_mem(table, memory_map_size); + break; default: assert(0); } - return NULL; + numa_set_preferred(oldnode); + return shm_object; } struct shm_object *shm_object_table_append_shm(struct shm_object_table *table,