projects
/
lttng-ust.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add userspace vuid/vgid contexts
[lttng-ust.git]
/
libringbuffer
/
ring_buffer_backend.c
diff --git
a/libringbuffer/ring_buffer_backend.c
b/libringbuffer/ring_buffer_backend.c
index 961f118a088f587ed60172d265d6c09c578b5106..a0ef74461bd12606b9d3bd6eaa14ac2ae9f600ab 100644
(file)
--- a/
libringbuffer/ring_buffer_backend.c
+++ b/
libringbuffer/ring_buffer_backend.c
@@
-19,6
+19,7
@@
*/
#define _GNU_SOURCE
*/
#define _GNU_SOURCE
+#define _LGPL_SOURCE
#include <unistd.h>
#include <urcu/arch.h>
#include <limits.h>
#include <unistd.h>
#include <urcu/arch.h>
#include <limits.h>
@@
-118,7
+119,7
@@
int lib_ring_buffer_backend_allocate(const struct lttng_ust_lib_ring_buffer_conf
bufb->buf_rsb.id = subbuffer_id(config, 0, 1, 0);
/* Allocate subbuffer packet counter table */
bufb->buf_rsb.id = subbuffer_id(config, 0, 1, 0);
/* Allocate subbuffer packet counter table */
- align_shm(shmobj, __alignof__(struct lttng_ust_lib_ring_buffer_backend_
subbuffer
));
+ align_shm(shmobj, __alignof__(struct lttng_ust_lib_ring_buffer_backend_
counts
));
set_shmp(bufb->buf_cnt, zalloc_shm(shmobj,
sizeof(struct lttng_ust_lib_ring_buffer_backend_counts)
* num_subbuf));
set_shmp(bufb->buf_cnt, zalloc_shm(shmobj,
sizeof(struct lttng_ust_lib_ring_buffer_backend_counts)
* num_subbuf));
@@
-186,7
+187,7
@@
void lib_ring_buffer_backend_reset(struct lttng_ust_lib_ring_buffer_backend *buf
chanb = &shmp(handle, bufb->chan)->backend;
if (!chanb)
chanb = &shmp(handle, bufb->chan)->backend;
if (!chanb)
-
abort()
;
+
return
;
config = &chanb->config;
num_subbuf_alloc = chanb->num_subbuf;
config = &chanb->config;
num_subbuf_alloc = chanb->num_subbuf;
@@
-198,7
+199,7
@@
void lib_ring_buffer_backend_reset(struct lttng_ust_lib_ring_buffer_backend *buf
sb = shmp_index(handle, bufb->buf_wsb, i);
if (!sb)
sb = shmp_index(handle, bufb->buf_wsb, i);
if (!sb)
-
abort()
;
+
return
;
sb->id = subbuffer_id(config, 0, 1, i);
}
if (chanb->extra_reader_sb)
sb->id = subbuffer_id(config, 0, 1, i);
}
if (chanb->extra_reader_sb)
@@
-213,10
+214,10
@@
void lib_ring_buffer_backend_reset(struct lttng_ust_lib_ring_buffer_backend *buf
sbp = shmp_index(handle, bufb->array, i);
if (!sbp)
sbp = shmp_index(handle, bufb->array, i);
if (!sbp)
-
abort()
;
+
return
;
pages = shmp(handle, sbp->shmp);
if (!pages)
pages = shmp(handle, sbp->shmp);
if (!pages)
-
abort()
;
+
return
;
/* Don't reset mmap_offset */
v_set(config, &pages->records_commit, 0);
v_set(config, &pages->records_unread, 0);
/* Don't reset mmap_offset */
v_set(config, &pages->records_commit, 0);
v_set(config, &pages->records_unread, 0);
@@
-333,6
+334,8
@@
int channel_backend_init(struct channel_backend *chanb,
shmsize += sizeof(struct lttng_ust_lib_ring_buffer_backend_pages) * num_subbuf_alloc;
shmsize += offset_align(shmsize, __alignof__(struct lttng_ust_lib_ring_buffer_backend_subbuffer));
shmsize += sizeof(struct lttng_ust_lib_ring_buffer_backend_subbuffer) * num_subbuf;
shmsize += sizeof(struct lttng_ust_lib_ring_buffer_backend_pages) * num_subbuf_alloc;
shmsize += offset_align(shmsize, __alignof__(struct lttng_ust_lib_ring_buffer_backend_subbuffer));
shmsize += sizeof(struct lttng_ust_lib_ring_buffer_backend_subbuffer) * num_subbuf;
+ shmsize += offset_align(shmsize, __alignof__(struct lttng_ust_lib_ring_buffer_backend_counts));
+ shmsize += sizeof(struct lttng_ust_lib_ring_buffer_backend_counts) * num_subbuf;
/* Per-cpu buffer size: control (after backend) */
shmsize += offset_align(shmsize, __alignof__(struct commit_counters_hot));
shmsize += sizeof(struct commit_counters_hot) * num_subbuf;
/* Per-cpu buffer size: control (after backend) */
shmsize += offset_align(shmsize, __alignof__(struct commit_counters_hot));
shmsize += sizeof(struct commit_counters_hot) * num_subbuf;
@@
-348,7
+351,7
@@
int channel_backend_init(struct channel_backend *chanb,
struct shm_object *shmobj;
shmobj = shm_object_table_alloc(handle->table, shmsize,
struct shm_object *shmobj;
shmobj = shm_object_table_alloc(handle->table, shmsize,
- SHM_OBJECT_SHM, stream_fds[i]);
+ SHM_OBJECT_SHM, stream_fds[i]
, i
);
if (!shmobj)
goto end;
align_shm(shmobj, __alignof__(struct lttng_ust_lib_ring_buffer));
if (!shmobj)
goto end;
align_shm(shmobj, __alignof__(struct lttng_ust_lib_ring_buffer));
@@
-367,7
+370,7
@@
int channel_backend_init(struct channel_backend *chanb,
struct lttng_ust_lib_ring_buffer *buf;
shmobj = shm_object_table_alloc(handle->table, shmsize,
struct lttng_ust_lib_ring_buffer *buf;
shmobj = shm_object_table_alloc(handle->table, shmsize,
- SHM_OBJECT_SHM, stream_fds[0]);
+ SHM_OBJECT_SHM, stream_fds[0]
, -1
);
if (!shmobj)
goto end;
align_shm(shmobj, __alignof__(struct lttng_ust_lib_ring_buffer));
if (!shmobj)
goto end;
align_shm(shmobj, __alignof__(struct lttng_ust_lib_ring_buffer));
@@
-420,6
+423,7
@@
size_t lib_ring_buffer_read(struct lttng_ust_lib_ring_buffer_backend *bufb, size
const struct lttng_ust_lib_ring_buffer_config *config;
ssize_t orig_len;
struct lttng_ust_lib_ring_buffer_backend_pages_shmp *rpages;
const struct lttng_ust_lib_ring_buffer_config *config;
ssize_t orig_len;
struct lttng_ust_lib_ring_buffer_backend_pages_shmp *rpages;
+ struct lttng_ust_lib_ring_buffer_backend_pages *backend_pages;
unsigned long sb_bindex, id;
void *src;
unsigned long sb_bindex, id;
void *src;
@@
-435,6
+439,8
@@
size_t lib_ring_buffer_read(struct lttng_ust_lib_ring_buffer_backend *bufb, size
id = bufb->buf_rsb.id;
sb_bindex = subbuffer_id_get_index(config, id);
rpages = shmp_index(handle, bufb->array, sb_bindex);
id = bufb->buf_rsb.id;
sb_bindex = subbuffer_id_get_index(config, id);
rpages = shmp_index(handle, bufb->array, sb_bindex);
+ if (!rpages)
+ return 0;
/*
* Underlying layer should never ask for reads across
* subbuffers.
/*
* Underlying layer should never ask for reads across
* subbuffers.
@@
-442,8
+448,10
@@
size_t lib_ring_buffer_read(struct lttng_ust_lib_ring_buffer_backend *bufb, size
CHAN_WARN_ON(chanb, offset >= chanb->buf_size);
CHAN_WARN_ON(chanb, config->mode == RING_BUFFER_OVERWRITE
&& subbuffer_id_is_noref(config, id));
CHAN_WARN_ON(chanb, offset >= chanb->buf_size);
CHAN_WARN_ON(chanb, config->mode == RING_BUFFER_OVERWRITE
&& subbuffer_id_is_noref(config, id));
- src = shmp_index(handle, shmp(handle, rpages->shmp)->p,
- offset & (chanb->subbuf_size - 1));
+ backend_pages = shmp(handle, rpages->shmp);
+ if (!backend_pages)
+ return 0;
+ src = shmp_index(handle, backend_pages->p, offset & (chanb->subbuf_size - 1));
if (caa_unlikely(!src))
return 0;
memcpy(dest, src, len);
if (caa_unlikely(!src))
return 0;
memcpy(dest, src, len);
@@
-469,6
+477,7
@@
int lib_ring_buffer_read_cstr(struct lttng_ust_lib_ring_buffer_backend *bufb, si
ssize_t string_len, orig_offset;
char *str;
struct lttng_ust_lib_ring_buffer_backend_pages_shmp *rpages;
ssize_t string_len, orig_offset;
char *str;
struct lttng_ust_lib_ring_buffer_backend_pages_shmp *rpages;
+ struct lttng_ust_lib_ring_buffer_backend_pages *backend_pages;
unsigned long sb_bindex, id;
chanb = &shmp(handle, bufb->chan)->backend;
unsigned long sb_bindex, id;
chanb = &shmp(handle, bufb->chan)->backend;
@@
-482,6
+491,8
@@
int lib_ring_buffer_read_cstr(struct lttng_ust_lib_ring_buffer_backend *bufb, si
id = bufb->buf_rsb.id;
sb_bindex = subbuffer_id_get_index(config, id);
rpages = shmp_index(handle, bufb->array, sb_bindex);
id = bufb->buf_rsb.id;
sb_bindex = subbuffer_id_get_index(config, id);
rpages = shmp_index(handle, bufb->array, sb_bindex);
+ if (!rpages)
+ return -EINVAL;
/*
* Underlying layer should never ask for reads across
* subbuffers.
/*
* Underlying layer should never ask for reads across
* subbuffers.
@@
-489,7
+500,10
@@
int lib_ring_buffer_read_cstr(struct lttng_ust_lib_ring_buffer_backend *bufb, si
CHAN_WARN_ON(chanb, offset >= chanb->buf_size);
CHAN_WARN_ON(chanb, config->mode == RING_BUFFER_OVERWRITE
&& subbuffer_id_is_noref(config, id));
CHAN_WARN_ON(chanb, offset >= chanb->buf_size);
CHAN_WARN_ON(chanb, config->mode == RING_BUFFER_OVERWRITE
&& subbuffer_id_is_noref(config, id));
- str = shmp_index(handle, shmp(handle, rpages->shmp)->p, offset & (chanb->subbuf_size - 1));
+ backend_pages = shmp(handle, rpages->shmp);
+ if (!backend_pages)
+ return -EINVAL;
+ str = shmp_index(handle, backend_pages->p, offset & (chanb->subbuf_size - 1));
if (caa_unlikely(!str))
return -EINVAL;
string_len = strnlen(str, len);
if (caa_unlikely(!str))
return -EINVAL;
string_len = strnlen(str, len);
@@
-516,6
+530,7
@@
void *lib_ring_buffer_read_offset_address(struct lttng_ust_lib_ring_buffer_backe
struct lttng_ust_shm_handle *handle)
{
struct lttng_ust_lib_ring_buffer_backend_pages_shmp *rpages;
struct lttng_ust_shm_handle *handle)
{
struct lttng_ust_lib_ring_buffer_backend_pages_shmp *rpages;
+ struct lttng_ust_lib_ring_buffer_backend_pages *backend_pages;
struct channel_backend *chanb;
const struct lttng_ust_lib_ring_buffer_config *config;
unsigned long sb_bindex, id;
struct channel_backend *chanb;
const struct lttng_ust_lib_ring_buffer_config *config;
unsigned long sb_bindex, id;
@@
-528,9
+543,14
@@
void *lib_ring_buffer_read_offset_address(struct lttng_ust_lib_ring_buffer_backe
id = bufb->buf_rsb.id;
sb_bindex = subbuffer_id_get_index(config, id);
rpages = shmp_index(handle, bufb->array, sb_bindex);
id = bufb->buf_rsb.id;
sb_bindex = subbuffer_id_get_index(config, id);
rpages = shmp_index(handle, bufb->array, sb_bindex);
+ if (!rpages)
+ return NULL;
CHAN_WARN_ON(chanb, config->mode == RING_BUFFER_OVERWRITE
&& subbuffer_id_is_noref(config, id));
CHAN_WARN_ON(chanb, config->mode == RING_BUFFER_OVERWRITE
&& subbuffer_id_is_noref(config, id));
- return shmp_index(handle, shmp(handle, rpages->shmp)->p, offset & (chanb->subbuf_size - 1));
+ backend_pages = shmp(handle, rpages->shmp);
+ if (!backend_pages)
+ return NULL;
+ return shmp_index(handle, backend_pages->p, offset & (chanb->subbuf_size - 1));
}
/**
}
/**
@@
-549,6
+569,7
@@
void *lib_ring_buffer_offset_address(struct lttng_ust_lib_ring_buffer_backend *b
{
size_t sbidx;
struct lttng_ust_lib_ring_buffer_backend_pages_shmp *rpages;
{
size_t sbidx;
struct lttng_ust_lib_ring_buffer_backend_pages_shmp *rpages;
+ struct lttng_ust_lib_ring_buffer_backend_pages *backend_pages;
struct channel_backend *chanb;
const struct lttng_ust_lib_ring_buffer_config *config;
unsigned long sb_bindex, id;
struct channel_backend *chanb;
const struct lttng_ust_lib_ring_buffer_config *config;
unsigned long sb_bindex, id;
@@
-566,7
+587,12
@@
void *lib_ring_buffer_offset_address(struct lttng_ust_lib_ring_buffer_backend *b
id = sb->id;
sb_bindex = subbuffer_id_get_index(config, id);
rpages = shmp_index(handle, bufb->array, sb_bindex);
id = sb->id;
sb_bindex = subbuffer_id_get_index(config, id);
rpages = shmp_index(handle, bufb->array, sb_bindex);
+ if (!rpages)
+ return NULL;
CHAN_WARN_ON(chanb, config->mode == RING_BUFFER_OVERWRITE
&& subbuffer_id_is_noref(config, id));
CHAN_WARN_ON(chanb, config->mode == RING_BUFFER_OVERWRITE
&& subbuffer_id_is_noref(config, id));
- return shmp_index(handle, shmp(handle, rpages->shmp)->p, offset & (chanb->subbuf_size - 1));
+ backend_pages = shmp(handle, rpages->shmp);
+ if (!backend_pages)
+ return NULL;
+ return shmp_index(handle, backend_pages->p, offset & (chanb->subbuf_size - 1));
}
}
This page took
0.027075 seconds
and
5
git commands to generate.