[lttng-dev] [RFC PATCH lttng-modules] Add RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS command
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Fri May 5 14:34:15 UTC 2017
Merged into master, thanks!
Mathieu
----- On May 4, 2017, at 5:25 PM, Jeremie Galarneau jeremie.galarneau at efficios.com wrote:
> There is no need to bump the LTTNG_MODULES_ABI_MINOR_VERSION
> since the multiple wildcard feature introduced as part of the 2.10
> release already bumps it from 2 to 3.
>
> Signed-off-by: Jérémie Galarneau <jeremie.galarneau at efficios.com>
> ---
> lib/ringbuffer/frontend.h | 4 ++++
> lib/ringbuffer/ring_buffer_frontend.c | 31 +++++++++++++++++++++++++++++++
> lib/ringbuffer/ring_buffer_vfs.c | 3 +++
> lib/ringbuffer/vfs.h | 6 ++++++
> 4 files changed, 44 insertions(+)
>
> diff --git a/lib/ringbuffer/frontend.h b/lib/ringbuffer/frontend.h
> index 6ff1545..909abc2 100644
> --- a/lib/ringbuffer/frontend.h
> +++ b/lib/ringbuffer/frontend.h
> @@ -106,6 +106,10 @@ extern void lib_ring_buffer_release_read(struct
> lib_ring_buffer *buf);
> extern int lib_ring_buffer_snapshot(struct lib_ring_buffer *buf,
> unsigned long *consumed,
> unsigned long *produced);
> +extern int lib_ring_buffer_snapshot_sample_positions(
> + struct lib_ring_buffer *buf,
> + unsigned long *consumed,
> + unsigned long *produced);
> extern void lib_ring_buffer_move_consumer(struct lib_ring_buffer *buf,
> unsigned long consumed_new);
>
> diff --git a/lib/ringbuffer/ring_buffer_frontend.c
> b/lib/ringbuffer/ring_buffer_frontend.c
> index 68b6238..a477832 100644
> --- a/lib/ringbuffer/ring_buffer_frontend.c
> +++ b/lib/ringbuffer/ring_buffer_frontend.c
> @@ -1120,6 +1120,37 @@ nodata:
> EXPORT_SYMBOL_GPL(lib_ring_buffer_snapshot);
>
> /**
> + * 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 lib_ring_buffer *buf,
> + unsigned long *consumed, unsigned long *produced)
> +{
> + struct channel *chan = buf->backend.chan;
> + const struct lib_ring_buffer_config *config = &chan->backend.config;
> +
> + smp_rmb();
> + *consumed = atomic_long_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_put_snapshot - move consumed counter forward
> *
> * Should only be called from consumer context.
> diff --git a/lib/ringbuffer/ring_buffer_vfs.c b/lib/ringbuffer/ring_buffer_vfs.c
> index 15da212..603dcfc 100644
> --- a/lib/ringbuffer/ring_buffer_vfs.c
> +++ b/lib/ringbuffer/ring_buffer_vfs.c
> @@ -202,6 +202,9 @@ long lib_ring_buffer_ioctl(struct file *filp, unsigned int
> cmd,
> lib_ring_buffer_switch_remote_empty(buf);
> return lib_ring_buffer_snapshot(buf, &buf->cons_snapshot,
> &buf->prod_snapshot);
> + case RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS:
> + return lib_ring_buffer_snapshot_sample_positions(buf,
> + &buf->cons_snapshot, &buf->prod_snapshot);
> case RING_BUFFER_SNAPSHOT_GET_CONSUMED:
> return put_ulong(buf->cons_snapshot, arg);
> case RING_BUFFER_SNAPSHOT_GET_PRODUCED:
> diff --git a/lib/ringbuffer/vfs.h b/lib/ringbuffer/vfs.h
> index 5444a4b..8a89caf 100644
> --- a/lib/ringbuffer/vfs.h
> +++ b/lib/ringbuffer/vfs.h
> @@ -115,6 +115,12 @@ ssize_t vfs_lib_ring_buffer_splice_read(struct file *in,
> loff_t *ppos,
> #define RING_BUFFER_FLUSH _IO(0xF6, 0x0C)
> /* Get the current version of the metadata cache (after a get_next). */
> #define RING_BUFFER_GET_METADATA_VERSION _IOR(0xF6, 0x0D, uint64_t)
> +/*
> + * Get a snapshot of the current ring buffer producer and consumer positions,
> + * regardless of whether or not the two positions are contained within the same
> + * sub-buffer.
> + */
> +#define RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS _IO(0xF6, 0x0E)
>
> #ifdef CONFIG_COMPAT
> /* Get a snapshot of the current ring buffer producer and consumer positions */
> --
> 2.12.2
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list