X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=libringbuffer%2Fshm.c;h=0153578c93a2cfddf3bdd69ae57324b516086651;hb=bfcda6cea270952898ea122c375f2ed19105adef;hp=8ac321e3931906888f79dd9e2419a7dbca8225de;hpb=429dadf0e28fe24be158ddb76d09f5f2308b6467;p=lttng-ust.git diff --git a/libringbuffer/shm.c b/libringbuffer/shm.c index 8ac321e3..0153578c 100644 --- a/libringbuffer/shm.c +++ b/libringbuffer/shm.c @@ -19,6 +19,7 @@ */ #define _LGPL_SOURCE +#include #include "shm.h" #include #include @@ -32,6 +33,9 @@ #include #include #include +#ifdef HAVE_LIBNUMA +#include +#endif #include #include @@ -39,9 +43,6 @@ * Ensure we have the required amount of space available by writing 0 * into the entire buffer. Not doing so can trigger SIGBUS when going * beyond the available shm space. - * - * Also ensure the file metadata is synced with the storage by using - * fsync(2). */ static int zero_file(int fd, size_t len) @@ -70,11 +71,6 @@ int zero_file(int fd, size_t len) } written += retlen; } - ret = fsync(fd); - if (ret) { - ret = (int) -errno; - goto error; - } ret = 0; error: free(zeropage); @@ -142,6 +138,15 @@ struct shm_object *_shm_object_table_alloc_shm(struct shm_object_table *table, PERROR("ftruncate"); goto error_ftruncate; } + /* + * Also ensure the file metadata is synced with the storage by using + * fsync(2). + */ + ret = fsync(shmfd); + if (ret) { + PERROR("fsync"); + goto error_fsync; + } obj->shm_fd_ownership = 0; obj->shm_fd = shmfd; @@ -161,6 +166,7 @@ struct shm_object *_shm_object_table_alloc_shm(struct shm_object_table *table, return obj; error_mmap: +error_fsync: error_ftruncate: error_zero_file: error_fcntl: @@ -241,18 +247,37 @@ 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) { + struct shm_object *shm_object; +#ifdef HAVE_LIBNUMA + int oldnode, node; + + 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(); +#endif /* HAVE_LIBNUMA */ 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; +#ifdef HAVE_LIBNUMA + numa_set_preferred(oldnode); +#endif /* HAVE_LIBNUMA */ + return shm_object; } struct shm_object *shm_object_table_append_shm(struct shm_object_table *table,