From f45930b75b297a5f80fe14ef2550b196ca750b4a Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Fri, 5 May 2017 10:33:06 -0400 Subject: [PATCH] Add ustctl_snapshot_sample_positions ustctl command MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The protocol's minor version is bumped since a new API entry point is introduced. The so name's "current" and "age" fields are bumped in accordance with the libtool guidelines[1]. [1] https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html Signed-off-by: Jérémie Galarneau Signed-off-by: Mathieu Desnoyers --- configure.ac | 2 +- include/lttng/ust-ctl.h | 1 + liblttng-ust-ctl/ustctl.c | 19 ++++++++++++++ libringbuffer/frontend.h | 5 ++++ libringbuffer/ring_buffer_frontend.c | 38 ++++++++++++++++++++++++++++ 5 files changed, 64 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 023cfd4e..77b212cd 100644 --- a/configure.ac +++ b/configure.ac @@ -22,7 +22,7 @@ AC_SUBST([LTTNG_UST_LIBRARY_VERSION], [0:0:0]) # This is the library version of liblttng-ust-ctl, used internally by # liblttng-ust, lttng-sessiond, and lttng-consumerd. -AC_SUBST([LTTNG_UST_CTL_LIBRARY_VERSION], [2:0:0]) +AC_SUBST([LTTNG_UST_CTL_LIBRARY_VERSION], [3:0:1]) AC_CONFIG_AUX_DIR([config]) AC_CANONICAL_TARGET diff --git a/include/lttng/ust-ctl.h b/include/lttng/ust-ctl.h index 7b750fd4..f6c1dc45 100644 --- a/include/lttng/ust-ctl.h +++ b/include/lttng/ust-ctl.h @@ -226,6 +226,7 @@ int ustctl_put_next_subbuf(struct ustctl_consumer_stream *stream); /* snapshot */ int ustctl_snapshot(struct ustctl_consumer_stream *stream); +int ustctl_snapshot_sample_positions(struct ustctl_consumer_stream *stream); int ustctl_snapshot_get_consumed(struct ustctl_consumer_stream *stream, unsigned long *pos); int ustctl_snapshot_get_produced(struct ustctl_consumer_stream *stream, diff --git a/liblttng-ust-ctl/ustctl.c b/liblttng-ust-ctl/ustctl.c index 7b41b992..8e2e8f1b 100644 --- a/liblttng-ust-ctl/ustctl.c +++ b/liblttng-ust-ctl/ustctl.c @@ -1501,6 +1501,25 @@ int ustctl_snapshot(struct ustctl_consumer_stream *stream) &buf->prod_snapshot, consumer_chan->chan->handle); } +/* + * Get a snapshot of the current ring buffer producer and consumer positions + * even if the consumed and produced positions are contained within the same + * subbuffer. + */ +int ustctl_snapshot_sample_positions(struct ustctl_consumer_stream *stream) +{ + struct lttng_ust_lib_ring_buffer *buf; + struct ustctl_consumer_channel *consumer_chan; + + if (!stream) + return -EINVAL; + buf = stream->buf; + consumer_chan = stream->chan; + return lib_ring_buffer_snapshot_sample_positions(buf, + &buf->cons_snapshot, &buf->prod_snapshot, + consumer_chan->chan->handle); +} + /* Get the consumer position (iteration start) */ int ustctl_snapshot_get_consumed(struct ustctl_consumer_stream *stream, unsigned long *pos) diff --git a/libringbuffer/frontend.h b/libringbuffer/frontend.h index 160fd455..a2f74596 100644 --- a/libringbuffer/frontend.h +++ b/libringbuffer/frontend.h @@ -131,6 +131,11 @@ extern int lib_ring_buffer_snapshot(struct lttng_ust_lib_ring_buffer *buf, unsigned long *consumed, unsigned long *produced, struct lttng_ust_shm_handle *handle); +extern int lib_ring_buffer_snapshot_sample_positions( + struct lttng_ust_lib_ring_buffer *buf, + unsigned long *consumed, + unsigned long *produced, + struct lttng_ust_shm_handle *handle); extern void lib_ring_buffer_move_consumer(struct lttng_ust_lib_ring_buffer *buf, unsigned long consumed_new, struct lttng_ust_shm_handle *handle); diff --git a/libringbuffer/ring_buffer_frontend.c b/libringbuffer/ring_buffer_frontend.c index 6dd81e14..9b166852 100644 --- a/libringbuffer/ring_buffer_frontend.c +++ b/libringbuffer/ring_buffer_frontend.c @@ -1305,6 +1305,44 @@ nodata: return -EAGAIN; } +/** + * Performs the same function as lib_ring_buffer_snapshot(), but the positions + * are saved regardless of whether the consumed and produced positions are + * in the same subbuffer. + * @buf: ring buffer + * @consumed: consumed byte count indicating the last position read + * @produced: produced byte count indicating the last position written + * + * This function is meant to provide information on the exact producer and + * consumer positions without regard for the "snapshot" feature. + */ +int lib_ring_buffer_snapshot_sample_positions( + struct lttng_ust_lib_ring_buffer *buf, + unsigned long *consumed, unsigned long *produced, + struct lttng_ust_shm_handle *handle) +{ + struct channel *chan; + const struct lttng_ust_lib_ring_buffer_config *config; + unsigned long consumed_cur, write_offset; + + chan = shmp(handle, buf->backend.chan); + if (!chan) + return -EPERM; + config = &chan->backend.config; + cmm_smp_rmb(); + *consumed = uatomic_read(&buf->consumed); + /* + * No need to issue a memory barrier between consumed count read and + * write offset read, because consumed count can only change + * concurrently in overwrite mode, and we keep a sequence counter + * identifier derived from the write offset to check we are getting + * the same sub-buffer we are expecting (the sub-buffers are atomically + * "tagged" upon writes, tags are checked upon read). + */ + *produced = v_read(config, &buf->offset); + return 0; +} + /** * lib_ring_buffer_move_consumer - move consumed counter forward * @buf: ring buffer -- 2.34.1