Add RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS command
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 4 May 2017 21:25:21 +0000 (17:25 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 5 May 2017 14:34:59 +0000 (10:34 -0400)
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@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
lib/ringbuffer/frontend.h
lib/ringbuffer/ring_buffer_frontend.c
lib/ringbuffer/ring_buffer_vfs.c
lib/ringbuffer/vfs.h

index 6ff154528dd6e2b0d2c39e388a64193c0da7b135..909abc2dc80c714b9aa1372f1a41625c54b2e6ab 100644 (file)
@@ -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);
 
index 68b62382e9fc87c2a307887cc67e144dfe1528a8..a477832ef45a9d30914d1dff1473d1e119e4e1d4 100644 (file)
@@ -1119,6 +1119,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
  *
index 15da212d3fa313e3b3a027b2638132cacbb1db40..274e976c974ecacf4edf293f648a428448bf8f55 100644 (file)
@@ -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:
@@ -340,6 +343,9 @@ long lib_ring_buffer_compat_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_COMPAT_SNAPSHOT_SAMPLE_POSITIONS:
+               return lib_ring_buffer_snapshot_sample_positions(buf,
+                               &buf->cons_snapshot, &buf->prod_snapshot);
        case RING_BUFFER_COMPAT_SNAPSHOT_GET_CONSUMED:
                return compat_put_ulong(buf->cons_snapshot, arg);
        case RING_BUFFER_COMPAT_SNAPSHOT_GET_PRODUCED:
index 5444a4b2bb6404a68ffc675f9badf5ec7cd1c808..204c57a81f6e9c11e968c1609c675551c02cb791 100644 (file)
@@ -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 */
@@ -149,6 +155,13 @@ ssize_t vfs_lib_ring_buffer_splice_read(struct file *in, loff_t *ppos,
 #define RING_BUFFER_COMPAT_FLUSH               RING_BUFFER_FLUSH
 /* Get the current version of the metadata cache (after a get_next). */
 #define RING_BUFFER_COMPAT_GET_METADATA_VERSION        RING_BUFFER_GET_METADATA_VERSION
+/*
+ * 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_COMPAT_SNAPSHOT_SAMPLE_POSITIONS   \
+       RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS
 #endif /* CONFIG_COMPAT */
 
 #endif /* _LIB_RING_BUFFER_VFS_H */
This page took 0.029831 seconds and 4 git commands to generate.