X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=libringbuffer%2Fring_buffer_frontend.c;h=7b276ad935a3b89e4a10b1a41402f8976b80bd70;hb=02275a1d8e68c32173b45f5a0e3b27d97007c840;hp=736c598ae0cd1a3794d263665b7aa36d5a5954b7;hpb=864a1eda22ed99266509ac76451c6f27f91aa17e;p=lttng-ust.git diff --git a/libringbuffer/ring_buffer_frontend.c b/libringbuffer/ring_buffer_frontend.c index 736c598a..7b276ad9 100644 --- a/libringbuffer/ring_buffer_frontend.c +++ b/libringbuffer/ring_buffer_frontend.c @@ -52,8 +52,11 @@ #include #include +#include +#include + #include "smp.h" -#include +#include "ringbuffer-config.h" #include "vatomic.h" #include "backend.h" #include "frontend.h" @@ -112,7 +115,7 @@ DEFINE_URCU_TLS(unsigned int, lib_ring_buffer_nesting); static pthread_mutex_t wakeup_fd_mutex = PTHREAD_MUTEX_INITIALIZER; static -void lib_ring_buffer_print_errors(struct channel *chan, +void lib_ring_buffer_print_errors(struct lttng_ust_lib_ring_buffer_channel *chan, struct lttng_ust_lib_ring_buffer *buf, int cpu, struct lttng_ust_shm_handle *handle); @@ -144,7 +147,7 @@ void lttng_ust_ringbuffer_set_allow_blocking(void) } /* Get blocking timeout, in ms */ -static int lttng_ust_ringbuffer_get_timeout(struct channel *chan) +static int lttng_ust_ringbuffer_get_timeout(struct lttng_ust_lib_ring_buffer_channel *chan) { if (!lttng_ust_allow_blocking) return 0; @@ -163,7 +166,7 @@ static int lttng_ust_ringbuffer_get_timeout(struct channel *chan) void lib_ring_buffer_reset(struct lttng_ust_lib_ring_buffer *buf, struct lttng_ust_shm_handle *handle) { - struct channel *chan; + struct lttng_ust_lib_ring_buffer_channel *chan; const struct lttng_ust_lib_ring_buffer_config *config; unsigned int i; @@ -217,7 +220,7 @@ void lib_ring_buffer_reset(struct lttng_ust_lib_ring_buffer *buf, * be using the iterator concurrently with reset. The previous current iterator * record is reset. */ -void channel_reset(struct channel *chan) +void channel_reset(struct lttng_ust_lib_ring_buffer_channel *chan) { /* * Reset iterators first. Will put the subbuffer if held for reading. @@ -328,11 +331,12 @@ int lib_ring_buffer_create(struct lttng_ust_lib_ring_buffer *buf, struct shm_object *shmobj) { const struct lttng_ust_lib_ring_buffer_config *config = &chanb->config; - struct channel *chan = caa_container_of(chanb, struct channel, backend); + struct lttng_ust_lib_ring_buffer_channel *chan = caa_container_of(chanb, + struct lttng_ust_lib_ring_buffer_channel, backend); struct lttng_ust_lib_ring_buffer_backend_subbuffer *wsb; - struct channel *shmp_chan; + struct lttng_ust_lib_ring_buffer_channel *shmp_chan; struct commit_counters_hot *cc_hot; - void *priv = channel_get_private(chan); + void *priv = channel_get_private_config(chan); size_t subbuf_header_size; uint64_t tsc; int ret; @@ -428,7 +432,7 @@ void lib_ring_buffer_channel_switch_timer(int sig, siginfo_t *si, void *uc) { const struct lttng_ust_lib_ring_buffer_config *config; struct lttng_ust_shm_handle *handle; - struct channel *chan; + struct lttng_ust_lib_ring_buffer_channel *chan; int cpu; assert(CMM_LOAD_SHARED(timer_signal.tid) == pthread_self()); @@ -472,7 +476,7 @@ end: static int lib_ring_buffer_poll_deliver(const struct lttng_ust_lib_ring_buffer_config *config, struct lttng_ust_lib_ring_buffer *buf, - struct channel *chan, + struct lttng_ust_lib_ring_buffer_channel *chan, struct lttng_ust_shm_handle *handle) { unsigned long consumed_old, consumed_idx, commit_count, write_offset; @@ -581,7 +585,7 @@ void lib_ring_buffer_wakeup(struct lttng_ust_lib_ring_buffer *buf, } static -void lib_ring_buffer_channel_do_read(struct channel *chan) +void lib_ring_buffer_channel_do_read(struct lttng_ust_lib_ring_buffer_channel *chan) { const struct lttng_ust_lib_ring_buffer_config *config; struct lttng_ust_shm_handle *handle; @@ -626,7 +630,7 @@ end: static void lib_ring_buffer_channel_read_timer(int sig, siginfo_t *si, void *uc) { - struct channel *chan; + struct lttng_ust_lib_ring_buffer_channel *chan; assert(CMM_LOAD_SHARED(timer_signal.tid) == pthread_self()); chan = si->si_value.sival_ptr; @@ -776,7 +780,7 @@ void lib_ring_buffer_wait_signal_thread_qs(unsigned int signr) } static -void lib_ring_buffer_channel_switch_timer_start(struct channel *chan) +void lib_ring_buffer_channel_switch_timer_start(struct lttng_ust_lib_ring_buffer_channel *chan) { struct sigevent sev; struct itimerspec its; @@ -810,7 +814,7 @@ void lib_ring_buffer_channel_switch_timer_start(struct channel *chan) } static -void lib_ring_buffer_channel_switch_timer_stop(struct channel *chan) +void lib_ring_buffer_channel_switch_timer_stop(struct lttng_ust_lib_ring_buffer_channel *chan) { int ret; @@ -829,7 +833,7 @@ void lib_ring_buffer_channel_switch_timer_stop(struct channel *chan) } static -void lib_ring_buffer_channel_read_timer_start(struct channel *chan) +void lib_ring_buffer_channel_read_timer_start(struct lttng_ust_lib_ring_buffer_channel *chan) { const struct lttng_ust_lib_ring_buffer_config *config = &chan->backend.config; struct sigevent sev; @@ -864,7 +868,7 @@ void lib_ring_buffer_channel_read_timer_start(struct channel *chan) } static -void lib_ring_buffer_channel_read_timer_stop(struct channel *chan) +void lib_ring_buffer_channel_read_timer_stop(struct lttng_ust_lib_ring_buffer_channel *chan) { const struct lttng_ust_lib_ring_buffer_config *config = &chan->backend.config; int ret; @@ -890,14 +894,14 @@ void lib_ring_buffer_channel_read_timer_stop(struct channel *chan) chan->read_timer_enabled = 0; } -static void channel_unregister_notifiers(struct channel *chan, +static void channel_unregister_notifiers(struct lttng_ust_lib_ring_buffer_channel *chan, struct lttng_ust_shm_handle *handle) { lib_ring_buffer_channel_switch_timer_stop(chan); lib_ring_buffer_channel_read_timer_stop(chan); } -static void channel_print_errors(struct channel *chan, +static void channel_print_errors(struct lttng_ust_lib_ring_buffer_channel *chan, struct lttng_ust_shm_handle *handle) { const struct lttng_ust_lib_ring_buffer_config *config = @@ -920,7 +924,7 @@ static void channel_print_errors(struct channel *chan, } } -static void channel_free(struct channel *chan, +static void channel_free(struct lttng_ust_lib_ring_buffer_channel *chan, struct lttng_ust_shm_handle *handle, int consumer) { @@ -934,9 +938,10 @@ static void channel_free(struct channel *chan, * channel_create - Create channel. * @config: ring buffer instance configuration * @name: name of the channel - * @priv_data: ring buffer client private data area pointer (output) - * @priv_data_size: length, in bytes, of the private data area. - * @priv_data_init: initialization data for private data. + * @priv_data_align: alignment, in bytes, of the private data area. (config) + * @priv_data_size: length, in bytes, of the private data area. (config) + * @priv_data_init: initialization data for private data. (config) + * @priv: local private data (memory owner by caller) * @buf_addr: pointer the the beginning of the preallocated buffer contiguous * address mapping. It is used only by RING_BUFFER_STATIC * configuration. It can be set to NULL for other backends. @@ -954,10 +959,10 @@ static void channel_free(struct channel *chan, */ struct lttng_ust_shm_handle *channel_create(const struct lttng_ust_lib_ring_buffer_config *config, const char *name, - void **priv_data, size_t priv_data_align, size_t priv_data_size, void *priv_data_init, + void *priv, void *buf_addr, size_t subbuf_size, size_t num_subbuf, unsigned int switch_timer_interval, unsigned int read_timer_interval, @@ -966,7 +971,7 @@ struct lttng_ust_shm_handle *channel_create(const struct lttng_ust_lib_ring_buff { int ret; size_t shmsize, chansize; - struct channel *chan; + struct lttng_ust_lib_ring_buffer_channel *chan; struct lttng_ust_shm_handle *handle; struct shm_object *shmobj; unsigned int nr_streams; @@ -1007,7 +1012,7 @@ struct lttng_ust_shm_handle *channel_create(const struct lttng_ust_lib_ring_buff goto error_table_alloc; /* Calculate the shm allocation layout */ - shmsize = sizeof(struct channel); + shmsize = sizeof(struct lttng_ust_lib_ring_buffer_channel); shmsize += lttng_ust_offset_align(shmsize, __alignof__(struct lttng_ust_lib_ring_buffer_shmp)); shmsize += sizeof(struct lttng_ust_lib_ring_buffer_shmp) * nr_streams; chansize = shmsize; @@ -1020,7 +1025,7 @@ struct lttng_ust_shm_handle *channel_create(const struct lttng_ust_lib_ring_buff -1, -1); if (!shmobj) goto error_append; - /* struct channel is at object 0, offset 0 (hardcoded) */ + /* struct lttng_ust_lib_ring_buffer_channel is at object 0, offset 0 (hardcoded) */ set_shmp(handle->chan, zalloc_shm(shmobj, chansize)); assert(handle->chan._ref.index == 0); assert(handle->chan._ref.offset == 0); @@ -1031,6 +1036,8 @@ struct lttng_ust_shm_handle *channel_create(const struct lttng_ust_lib_ring_buff /* space for private data */ if (priv_data_size) { + void *priv_config; + DECLARE_SHMP(void, priv_data_alloc); align_shm(shmobj, priv_data_align); @@ -1038,16 +1045,16 @@ struct lttng_ust_shm_handle *channel_create(const struct lttng_ust_lib_ring_buff set_shmp(priv_data_alloc, zalloc_shm(shmobj, priv_data_size)); if (!shmp(handle, priv_data_alloc)) goto error_append; - *priv_data = channel_get_private(chan); - memcpy(*priv_data, priv_data_init, priv_data_size); + priv_config = channel_get_private_config(chan); + memcpy(priv_config, priv_data_init, priv_data_size); } else { chan->priv_data_offset = -1; - if (priv_data) - *priv_data = NULL; } chan->u.s.blocking_timeout_ms = (int32_t) blocking_timeout_ms; + channel_set_private(chan, priv); + ret = channel_backend_init(&chan->backend, name, config, subbuf_size, num_subbuf, handle, stream_fds); @@ -1092,7 +1099,7 @@ struct lttng_ust_shm_handle *channel_handle_create(void *data, memory_map_size, wakeup_fd); if (!object) goto error_table_object; - /* struct channel is at object 0, offset 0 (hardcoded) */ + /* struct lttng_ust_lib_ring_buffer_channel is at object 0, offset 0 (hardcoded) */ handle->chan._ref.index = 0; handle->chan._ref.offset = 0; return handle; @@ -1126,7 +1133,7 @@ unsigned int channel_handle_get_nr_streams(struct lttng_ust_shm_handle *handle) } static -void channel_release(struct channel *chan, struct lttng_ust_shm_handle *handle, +void channel_release(struct lttng_ust_lib_ring_buffer_channel *chan, struct lttng_ust_shm_handle *handle, int consumer) { channel_free(chan, handle, consumer); @@ -1142,7 +1149,7 @@ void channel_release(struct channel *chan, struct lttng_ust_shm_handle *handle, * consumption of finalized channels, get_subbuf() will return -ENODATA. * They should release their handle at that point. */ -void channel_destroy(struct channel *chan, struct lttng_ust_shm_handle *handle, +void channel_destroy(struct lttng_ust_lib_ring_buffer_channel *chan, struct lttng_ust_shm_handle *handle, int consumer) { if (consumer) { @@ -1167,7 +1174,7 @@ void channel_destroy(struct channel *chan, struct lttng_ust_shm_handle *handle, struct lttng_ust_lib_ring_buffer *channel_get_ring_buffer( const struct lttng_ust_lib_ring_buffer_config *config, - struct channel *chan, int cpu, + struct lttng_ust_lib_ring_buffer_channel *chan, int cpu, struct lttng_ust_shm_handle *handle, int *shm_fd, int *wait_fd, int *wakeup_fd, @@ -1191,7 +1198,7 @@ struct lttng_ust_lib_ring_buffer *channel_get_ring_buffer( } int ring_buffer_channel_close_wait_fd(const struct lttng_ust_lib_ring_buffer_config *config, - struct channel *chan, + struct lttng_ust_lib_ring_buffer_channel *chan, struct lttng_ust_shm_handle *handle) { struct shm_ref *ref; @@ -1201,7 +1208,7 @@ int ring_buffer_channel_close_wait_fd(const struct lttng_ust_lib_ring_buffer_con } int ring_buffer_channel_close_wakeup_fd(const struct lttng_ust_lib_ring_buffer_config *config, - struct channel *chan, + struct lttng_ust_lib_ring_buffer_channel *chan, struct lttng_ust_shm_handle *handle) { struct shm_ref *ref; @@ -1211,7 +1218,7 @@ int ring_buffer_channel_close_wakeup_fd(const struct lttng_ust_lib_ring_buffer_c } int ring_buffer_stream_close_wait_fd(const struct lttng_ust_lib_ring_buffer_config *config, - struct channel *chan, + struct lttng_ust_lib_ring_buffer_channel *chan, struct lttng_ust_shm_handle *handle, int cpu) { @@ -1228,7 +1235,7 @@ int ring_buffer_stream_close_wait_fd(const struct lttng_ust_lib_ring_buffer_conf } int ring_buffer_stream_close_wakeup_fd(const struct lttng_ust_lib_ring_buffer_config *config, - struct channel *chan, + struct lttng_ust_lib_ring_buffer_channel *chan, struct lttng_ust_shm_handle *handle, int cpu) { @@ -1260,7 +1267,7 @@ int lib_ring_buffer_open_read(struct lttng_ust_lib_ring_buffer *buf, void lib_ring_buffer_release_read(struct lttng_ust_lib_ring_buffer *buf, struct lttng_ust_shm_handle *handle) { - struct channel *chan = shmp(handle, buf->backend.chan); + struct lttng_ust_lib_ring_buffer_channel *chan = shmp(handle, buf->backend.chan); if (!chan) return; @@ -1283,7 +1290,7 @@ int lib_ring_buffer_snapshot(struct lttng_ust_lib_ring_buffer *buf, unsigned long *consumed, unsigned long *produced, struct lttng_ust_shm_handle *handle) { - struct channel *chan; + struct lttng_ust_lib_ring_buffer_channel *chan; const struct lttng_ust_lib_ring_buffer_config *config; unsigned long consumed_cur, write_offset; int finalized; @@ -1348,7 +1355,7 @@ int lib_ring_buffer_snapshot_sample_positions( unsigned long *consumed, unsigned long *produced, struct lttng_ust_shm_handle *handle) { - struct channel *chan; + struct lttng_ust_lib_ring_buffer_channel *chan; const struct lttng_ust_lib_ring_buffer_config *config; chan = shmp(handle, buf->backend.chan); @@ -1379,7 +1386,7 @@ void lib_ring_buffer_move_consumer(struct lttng_ust_lib_ring_buffer *buf, struct lttng_ust_shm_handle *handle) { struct lttng_ust_lib_ring_buffer_backend *bufb = &buf->backend; - struct channel *chan; + struct lttng_ust_lib_ring_buffer_channel *chan; unsigned long consumed; chan = shmp(handle, bufb->chan); @@ -1410,7 +1417,7 @@ int lib_ring_buffer_get_subbuf(struct lttng_ust_lib_ring_buffer *buf, unsigned long consumed, struct lttng_ust_shm_handle *handle) { - struct channel *chan; + struct lttng_ust_lib_ring_buffer_channel *chan; const struct lttng_ust_lib_ring_buffer_config *config; unsigned long consumed_cur, consumed_idx, commit_count, write_offset; int ret, finalized, nr_retry = LTTNG_UST_RING_BUFFER_GET_RETRY; @@ -1574,7 +1581,7 @@ void lib_ring_buffer_put_subbuf(struct lttng_ust_lib_ring_buffer *buf, struct lttng_ust_shm_handle *handle) { struct lttng_ust_lib_ring_buffer_backend *bufb = &buf->backend; - struct channel *chan; + struct lttng_ust_lib_ring_buffer_channel *chan; const struct lttng_ust_lib_ring_buffer_config *config; unsigned long sb_bindex, consumed_idx, consumed; struct lttng_ust_lib_ring_buffer_backend_pages_shmp *rpages; @@ -1641,7 +1648,7 @@ void lib_ring_buffer_put_subbuf(struct lttng_ust_lib_ring_buffer *buf, */ static void lib_ring_buffer_print_subbuffer_errors(struct lttng_ust_lib_ring_buffer *buf, - struct channel *chan, + struct lttng_ust_lib_ring_buffer_channel *chan, unsigned long cons_offset, int cpu, struct lttng_ust_shm_handle *handle) @@ -1676,9 +1683,8 @@ void lib_ring_buffer_print_subbuffer_errors(struct lttng_ust_lib_ring_buffer *bu static void lib_ring_buffer_print_buffer_errors(struct lttng_ust_lib_ring_buffer *buf, - struct channel *chan, - void *priv, int cpu, - struct lttng_ust_shm_handle *handle) + struct lttng_ust_lib_ring_buffer_channel *chan, + int cpu, struct lttng_ust_shm_handle *handle) { const struct lttng_ust_lib_ring_buffer_config *config = &chan->backend.config; unsigned long write_offset, cons_offset; @@ -1706,12 +1712,11 @@ void lib_ring_buffer_print_buffer_errors(struct lttng_ust_lib_ring_buffer *buf, } static -void lib_ring_buffer_print_errors(struct channel *chan, +void lib_ring_buffer_print_errors(struct lttng_ust_lib_ring_buffer_channel *chan, struct lttng_ust_lib_ring_buffer *buf, int cpu, struct lttng_ust_shm_handle *handle) { const struct lttng_ust_lib_ring_buffer_config *config = &chan->backend.config; - void *priv = channel_get_private(chan); if (!strcmp(chan->backend.name, "relay-metadata-mmap")) { DBG("ring buffer %s: %lu records written, " @@ -1737,7 +1742,7 @@ void lib_ring_buffer_print_errors(struct channel *chan, v_read(config, &buf->records_lost_wrap), v_read(config, &buf->records_lost_big)); } - lib_ring_buffer_print_buffer_errors(buf, chan, priv, cpu, handle); + lib_ring_buffer_print_buffer_errors(buf, chan, cpu, handle); } /* @@ -1748,7 +1753,7 @@ void lib_ring_buffer_print_errors(struct channel *chan, */ static void lib_ring_buffer_switch_old_start(struct lttng_ust_lib_ring_buffer *buf, - struct channel *chan, + struct lttng_ust_lib_ring_buffer_channel *chan, struct switch_offsets *offsets, uint64_t tsc, struct lttng_ust_shm_handle *handle) @@ -1789,7 +1794,7 @@ void lib_ring_buffer_switch_old_start(struct lttng_ust_lib_ring_buffer *buf, */ static void lib_ring_buffer_switch_old_end(struct lttng_ust_lib_ring_buffer *buf, - struct channel *chan, + struct lttng_ust_lib_ring_buffer_channel *chan, struct switch_offsets *offsets, uint64_t tsc, struct lttng_ust_shm_handle *handle) @@ -1844,7 +1849,7 @@ void lib_ring_buffer_switch_old_end(struct lttng_ust_lib_ring_buffer *buf, */ static void lib_ring_buffer_switch_new_start(struct lttng_ust_lib_ring_buffer *buf, - struct channel *chan, + struct lttng_ust_lib_ring_buffer_channel *chan, struct switch_offsets *offsets, uint64_t tsc, struct lttng_ust_shm_handle *handle) @@ -1884,7 +1889,7 @@ void lib_ring_buffer_switch_new_start(struct lttng_ust_lib_ring_buffer *buf, */ static void lib_ring_buffer_switch_new_end(struct lttng_ust_lib_ring_buffer *buf, - struct channel *chan, + struct lttng_ust_lib_ring_buffer_channel *chan, struct switch_offsets *offsets, uint64_t tsc, struct lttng_ust_shm_handle *handle) @@ -1919,7 +1924,7 @@ void lib_ring_buffer_switch_new_end(struct lttng_ust_lib_ring_buffer *buf, static int lib_ring_buffer_try_switch_slow(enum switch_mode mode, struct lttng_ust_lib_ring_buffer *buf, - struct channel *chan, + struct lttng_ust_lib_ring_buffer_channel *chan, struct switch_offsets *offsets, uint64_t *tsc, struct lttng_ust_shm_handle *handle) @@ -2035,7 +2040,7 @@ int lib_ring_buffer_try_switch_slow(enum switch_mode mode, void lib_ring_buffer_switch_slow(struct lttng_ust_lib_ring_buffer *buf, enum switch_mode mode, struct lttng_ust_shm_handle *handle) { - struct channel *chan; + struct lttng_ust_lib_ring_buffer_channel *chan; const struct lttng_ust_lib_ring_buffer_config *config; struct switch_offsets offsets; unsigned long oldidx; @@ -2114,7 +2119,7 @@ bool handle_blocking_retry(int *timeout_left_ms) */ static int lib_ring_buffer_try_reserve_slow(struct lttng_ust_lib_ring_buffer *buf, - struct channel *chan, + struct lttng_ust_lib_ring_buffer_channel *chan, struct switch_offsets *offsets, struct lttng_ust_lib_ring_buffer_ctx *ctx, void *client_ctx) @@ -2308,7 +2313,7 @@ retry: int lib_ring_buffer_reserve_slow(struct lttng_ust_lib_ring_buffer_ctx *ctx, void *client_ctx) { - struct channel *chan = ctx->chan; + struct lttng_ust_lib_ring_buffer_channel *chan = ctx->chan; struct lttng_ust_shm_handle *handle = ctx->handle; const struct lttng_ust_lib_ring_buffer_config *config = &chan->backend.config; struct lttng_ust_lib_ring_buffer *buf; @@ -2426,7 +2431,7 @@ void deliver_count_events(const struct lttng_ust_lib_ring_buffer_config *config, void lib_ring_buffer_check_deliver_slow(const struct lttng_ust_lib_ring_buffer_config *config, struct lttng_ust_lib_ring_buffer *buf, - struct channel *chan, + struct lttng_ust_lib_ring_buffer_channel *chan, unsigned long offset, unsigned long commit_count, unsigned long idx,