Fix: don't perform extra flush on metadata channel
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 20 May 2016 00:30:07 +0000 (20:30 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 20 May 2016 00:40:16 +0000 (20:40 -0400)
The metadata channel requires that the LTTng client layer and the ring
buffer keep a notion of the amount of data produced in the channel.

This issue has been introduced recently by commit
"Fix: flush empty packets on snapshot channel".

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
lib/ringbuffer/frontend_internal.h
lib/ringbuffer/ring_buffer_frontend.c
lib/ringbuffer/ring_buffer_vfs.c
lttng-abi.c

index b13edd10b7e80c2803d07343b1edcc1dbe0c0883..76bf20e79b1ae21ad217bc073c9e9f02a1709ee4 100644 (file)
@@ -159,6 +159,9 @@ void lib_ring_buffer_switch_slow(struct lib_ring_buffer *buf,
 extern
 void lib_ring_buffer_switch_remote(struct lib_ring_buffer *buf);
 
+extern
+void lib_ring_buffer_switch_remote_empty(struct lib_ring_buffer *buf);
+
 /* Buffer write helpers */
 
 static inline
index 017d30f5ddf673c36f2932d2fe83581a35bea50c..9cd62ced16ae19deedd8eea935c507e09cd5616a 100644 (file)
@@ -904,15 +904,6 @@ int lib_ring_buffer_snapshot(struct lib_ring_buffer *buf,
        unsigned long consumed_cur, write_offset;
        int finalized;
 
-       /*
-        * First, ensure we perform a "final" flush onto the stream.  This will
-        * ensure we create a packet of padding if we encounter an empty
-        * packet. This ensures the time-stamps right before the snapshot is
-        * used as end of packet timestamp.
-        */
-       if (!buf->quiescent)
-               _lib_ring_buffer_switch_remote(buf, SWITCH_FLUSH);
-
 retry:
        finalized = ACCESS_ONCE(buf->finalized);
        /*
@@ -1663,6 +1654,13 @@ void lib_ring_buffer_switch_remote(struct lib_ring_buffer *buf)
 }
 EXPORT_SYMBOL_GPL(lib_ring_buffer_switch_remote);
 
+/* Switch sub-buffer even if current sub-buffer is empty. */
+void lib_ring_buffer_switch_remote_empty(struct lib_ring_buffer *buf)
+{
+       _lib_ring_buffer_switch_remote(buf, SWITCH_FLUSH);
+}
+EXPORT_SYMBOL_GPL(lib_ring_buffer_switch_remote_empty);
+
 /*
  * Returns :
  * 0 if ok
index f1a8bab781cd2f5829c552067eefdb2365c1f2e7..15da212d3fa313e3b3a027b2638132cacbb1db40 100644 (file)
@@ -191,6 +191,15 @@ long lib_ring_buffer_ioctl(struct file *filp, unsigned int cmd,
 
        switch (cmd) {
        case RING_BUFFER_SNAPSHOT:
+               /*
+                * First, ensure we perform a "final" flush onto the
+                * stream.  This will ensure we create a packet of
+                * padding if we encounter an empty packet. This ensures
+                * the time-stamps right before the snapshot is used as
+                * end of packet timestamp.
+                */
+               if (!buf->quiescent)
+                       lib_ring_buffer_switch_remote_empty(buf);
                return lib_ring_buffer_snapshot(buf, &buf->cons_snapshot,
                                            &buf->prod_snapshot);
        case RING_BUFFER_SNAPSHOT_GET_CONSUMED:
@@ -320,6 +329,15 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd,
 
        switch (cmd) {
        case RING_BUFFER_COMPAT_SNAPSHOT:
+               /*
+                * First, ensure we perform a "final" flush onto the
+                * stream.  This will ensure we create a packet of
+                * padding if we encounter an empty packet. This ensures
+                * the time-stamps right before the snapshot is used as
+                * end of packet timestamp.
+                */
+               if (!buf->quiescent)
+                       lib_ring_buffer_switch_remote_empty(buf);
                return lib_ring_buffer_snapshot(buf, &buf->cons_snapshot,
                                                &buf->prod_snapshot);
        case RING_BUFFER_COMPAT_SNAPSHOT_GET_CONSUMED:
index 87465189060edd4122cc9f8c5ad87c3fe218b6f1..4dd9273f1eb9a0551d343dfd7706b0893f45fb2d 100644 (file)
@@ -702,6 +702,18 @@ long lttng_metadata_ring_buffer_ioctl(struct file *filp,
 
                return put_u64(stream->version, arg);
        }
+       case RING_BUFFER_SNAPSHOT:
+       {
+               /*
+                * Force the buffer to quiescent so the ring buffer
+                * don't attempt to perform a SWITCH_FLUSH, which would
+                * desynchronize the client accounting of the amount of
+                * data available in the buffer from the ring buffer
+                * view.
+                */
+               buf->quiescent = true;
+               break;
+       }
        default:
                break;
        }
@@ -778,6 +790,18 @@ long lttng_metadata_ring_buffer_compat_ioctl(struct file *filp,
 
                return put_u64(stream->version, arg);
        }
+       case RING_BUFFER_SNAPSHOT:
+       {
+               /*
+                * Force the buffer to quiescent so the ring buffer
+                * don't attempt to perform a SWITCH_FLUSH, which would
+                * desynchronize the client accounting of the amount of
+                * data available in the buffer from the ring buffer
+                * view.
+                */
+               buf->quiescent = true;
+               break;
+       }
        default:
                break;
        }
This page took 0.028023 seconds and 4 git commands to generate.