*/
#define _GNU_SOURCE
+#include <unistd.h>
#include <urcu/arch.h>
#include <limits.h>
#include "smp.h"
#include "shm.h"
-#define UINT_MAX_STR_LEN 11 /* includes \0 */
-
/**
* lib_ring_buffer_backend_allocate - allocate a channel buffer
* @config: ring buffer instance configuration
unsigned long subbuf_size, mmap_offset = 0;
unsigned long num_subbuf_alloc;
unsigned long i;
+ long page_size;
subbuf_size = chanb->subbuf_size;
num_subbuf_alloc = num_subbuf;
if (extra_reader_sb)
num_subbuf_alloc++;
+ page_size = sysconf(_SC_PAGE_SIZE);
+ if (page_size <= 0) {
+ goto page_size_error;
+ }
+
align_shm(shmobj, __alignof__(struct lttng_ust_lib_ring_buffer_backend_pages_shmp));
set_shmp(bufb->array, zalloc_shm(shmobj,
sizeof(struct lttng_ust_lib_ring_buffer_backend_pages_shmp) * num_subbuf_alloc));
/*
* This is the largest element (the buffer pages) which needs to
- * be aligned on PAGE_SIZE.
+ * be aligned on page size.
*/
- align_shm(shmobj, PAGE_SIZE);
+ align_shm(shmobj, page_size);
set_shmp(bufb->memory_map, zalloc_shm(shmobj,
subbuf_size * num_subbuf_alloc));
if (caa_unlikely(!shmp(handle, bufb->memory_map)))
memory_map_error:
/* bufb->array will be freed by shm teardown */
array_error:
+page_size_error:
return -ENOMEM;
}
* @name: channel name
* @config: client ring buffer configuration
* @parent: dentry of parent directory, %NULL for root directory
- * @subbuf_size: size of sub-buffers (> PAGE_SIZE, power of 2)
+ * @subbuf_size: size of sub-buffers (> page size, power of 2)
* @num_subbuf: number of sub-buffers (power of 2)
* @lttng_ust_shm_handle: shared memory handle
- * @shm_path: shared memory files path
+ * @stream_fds: stream file descriptors.
*
* Returns channel pointer if successful, %NULL otherwise.
*
const struct lttng_ust_lib_ring_buffer_config *config,
size_t subbuf_size, size_t num_subbuf,
struct lttng_ust_shm_handle *handle,
- const char *shm_path)
+ const int *stream_fds)
{
struct channel *chan = caa_container_of(chanb, struct channel, backend);
unsigned int i;
int ret;
size_t shmsize = 0, num_subbuf_alloc;
+ long page_size;
if (!name)
return -EPERM;
+ page_size = sysconf(_SC_PAGE_SIZE);
+ if (page_size <= 0) {
+ return -ENOMEM;
+ }
/* Check that the subbuffer size is larger than a page. */
- if (subbuf_size < PAGE_SIZE)
+ if (subbuf_size < page_size)
return -EINVAL;
/*
num_subbuf_alloc = num_subbuf + 1;
shmsize += offset_align(shmsize, __alignof__(struct lttng_ust_lib_ring_buffer_backend_pages_shmp));
shmsize += sizeof(struct lttng_ust_lib_ring_buffer_backend_pages_shmp) * num_subbuf_alloc;
- shmsize += offset_align(shmsize, PAGE_SIZE);
+ shmsize += offset_align(shmsize, page_size);
shmsize += subbuf_size * num_subbuf_alloc;
shmsize += offset_align(shmsize, __alignof__(struct lttng_ust_lib_ring_buffer_backend_pages));
shmsize += sizeof(struct lttng_ust_lib_ring_buffer_backend_pages) * num_subbuf_alloc;
*/
for_each_possible_cpu(i) {
struct shm_object *shmobj;
- char shm_buf_path[PATH_MAX];
-
- if (shm_path) {
- char cpu_nr[UINT_MAX_STR_LEN]; /* unsigned int max len */
-
- strncpy(shm_buf_path, shm_path, PATH_MAX);
- shm_buf_path[PATH_MAX - 1] = '\0';
- ret = snprintf(cpu_nr, UINT_MAX_STR_LEN, "%u", i);
- if (ret != 1)
- goto end;
- strncat(shm_buf_path, cpu_nr,
- PATH_MAX - strlen(shm_buf_path) - 1);
- }
+
shmobj = shm_object_table_alloc(handle->table, shmsize,
- SHM_OBJECT_SHM, shm_path ? shm_buf_path : NULL);
+ SHM_OBJECT_SHM, stream_fds[i]);
if (!shmobj)
goto end;
align_shm(shmobj, __alignof__(struct lttng_ust_lib_ring_buffer));
struct lttng_ust_lib_ring_buffer *buf;
shmobj = shm_object_table_alloc(handle->table, shmsize,
- SHM_OBJECT_SHM, shm_path);
+ SHM_OBJECT_SHM, stream_fds[0]);
if (!shmobj)
goto end;
align_shm(shmobj, __alignof__(struct lttng_ust_lib_ring_buffer));