X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=libringbuffer%2Fshm.c;h=10b3bcef110a979ce2169ccf10417e470e122ba9;hb=ab12eb57cf3fdd2c25df16a3d1e770a2642b93e8;hp=135a2007b0e780221a0aa3cddeffe528a6e54733;hpb=4b68c31f1859175d2bd4e1b42f1b7d301e84760f;p=lttng-ust.git diff --git a/libringbuffer/shm.c b/libringbuffer/shm.c index 135a2007..10b3bcef 100644 --- a/libringbuffer/shm.c +++ b/libringbuffer/shm.c @@ -19,6 +19,7 @@ */ #define _LGPL_SOURCE +#include #include "shm.h" #include #include @@ -32,7 +33,11 @@ #include #include #include +#include +#ifdef HAVE_LIBNUMA #include +#include +#endif #include #include @@ -241,23 +246,47 @@ alloc_error: return NULL; } +/* + * libnuma prints errors on the console even for numa_available(). + * Work-around this limitation by using get_mempolicy() directly to + * check whether the kernel supports mempolicy. + */ +#ifdef HAVE_LIBNUMA +static bool lttng_is_numa_available(void) +{ + int ret; + + ret = get_mempolicy(NULL, NULL, 0, NULL, 0); + if (ret && errno == ENOSYS) { + return false; + } + return numa_available() > 0; +} +#endif + 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 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); +#ifdef HAVE_LIBNUMA + int oldnode = 0, node; + bool numa_avail; + + numa_avail = lttng_is_numa_available(); + if (numa_avail) { + 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(); } - if (cpu < 0 || node < 0) - numa_set_localalloc(); +#endif /* HAVE_LIBNUMA */ switch (type) { case SHM_OBJECT_SHM: shm_object = _shm_object_table_alloc_shm(table, memory_map_size, @@ -269,7 +298,10 @@ struct shm_object *shm_object_table_alloc(struct shm_object_table *table, default: assert(0); } - numa_set_preferred(oldnode); +#ifdef HAVE_LIBNUMA + if (numa_avail) + numa_set_preferred(oldnode); +#endif /* HAVE_LIBNUMA */ return shm_object; }