X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libringbuffer%2Fshm.c;h=566ed467fe2f715bc60f56449b222964c8b51acd;hb=053e6e240f3fb5b2427fb28f8f09c652e2bdb39a;hp=10b3bcef110a979ce2169ccf10417e470e122ba9;hpb=8a208943e21700211beee3ea64180a5a534c7d2a;p=lttng-ust.git diff --git a/libringbuffer/shm.c b/libringbuffer/shm.c index 10b3bcef..566ed467 100644 --- a/libringbuffer/shm.c +++ b/libringbuffer/shm.c @@ -19,7 +19,6 @@ */ #define _LGPL_SOURCE -#include #include "shm.h" #include #include @@ -34,12 +33,14 @@ #include #include #include +#include #ifdef HAVE_LIBNUMA #include #include #endif #include #include +#include "mmap.h" /* * Ensure we have the required amount of space available by writing 0 @@ -127,19 +128,27 @@ struct shm_object *_shm_object_table_alloc_shm(struct shm_object_table *table, } memcpy(obj->wait_fd, waitfd, sizeof(waitfd)); - /* create shm */ + /* + * Set POSIX shared memory object size + * + * First, use ftruncate() to set its size, some implementations won't + * allow writes past the size set by ftruncate. + * Then, use write() to fill it with zeros, this allows us to fully + * allocate it and detect a shortage of shm space without dealing with + * a SIGBUS. + */ shmfd = stream_fd; - ret = zero_file(shmfd, memory_map_size); - if (ret) { - PERROR("zero_file"); - goto error_zero_file; - } ret = ftruncate(shmfd, memory_map_size); if (ret) { PERROR("ftruncate"); goto error_ftruncate; } + ret = zero_file(shmfd, memory_map_size); + if (ret) { + PERROR("zero_file"); + goto error_zero_file; + } /* * Also ensure the file metadata is synced with the storage by using * fsync(2). @@ -154,7 +163,7 @@ struct shm_object *_shm_object_table_alloc_shm(struct shm_object_table *table, /* memory_map: mmap */ memory_map = mmap(NULL, memory_map_size, PROT_READ | PROT_WRITE, - MAP_SHARED, shmfd, 0); + MAP_SHARED | LTTNG_MAP_POPULATE, shmfd, 0); if (memory_map == MAP_FAILED) { PERROR("mmap"); goto error_mmap; @@ -327,11 +336,6 @@ struct shm_object *shm_object_table_append_shm(struct shm_object_table *table, obj->shm_fd = shm_fd; obj->shm_fd_ownership = 1; - ret = fcntl(obj->wait_fd[1], F_SETFD, FD_CLOEXEC); - if (ret < 0) { - PERROR("fcntl"); - goto error_fcntl; - } /* The write end of the pipe needs to be non-blocking */ ret = fcntl(obj->wait_fd[1], F_SETFL, O_NONBLOCK); if (ret < 0) { @@ -341,7 +345,7 @@ struct shm_object *shm_object_table_append_shm(struct shm_object_table *table, /* memory_map: mmap */ memory_map = mmap(NULL, memory_map_size, PROT_READ | PROT_WRITE, - MAP_SHARED, shm_fd, 0); + MAP_SHARED | LTTNG_MAP_POPULATE, shm_fd, 0); if (memory_map == MAP_FAILED) { PERROR("mmap"); goto error_mmap; @@ -522,6 +526,6 @@ struct shm_ref zalloc_shm(struct shm_object *obj, size_t len) void align_shm(struct shm_object *obj, size_t align) { - size_t offset_len = offset_align(obj->allocated_len, align); + size_t offset_len = lttng_ust_offset_align(obj->allocated_len, align); obj->allocated_len += offset_len; }