[lttng-dev] [RFC PATCH lttng-modules] Add RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS command
Jérémie Galarneau
jeremie.galarneau at efficios.com
Thu May 4 21:25:21 UTC 2017
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
More information about the lttng-dev
mailing list