summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
a637014)
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>
extern
void lib_ring_buffer_switch_remote(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
/* Buffer write helpers */
static inline
unsigned long consumed_cur, write_offset;
int finalized;
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);
/*
retry:
finalized = ACCESS_ONCE(buf->finalized);
/*
}
EXPORT_SYMBOL_GPL(lib_ring_buffer_switch_remote);
}
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);
+
switch (cmd) {
case RING_BUFFER_SNAPSHOT:
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:
return lib_ring_buffer_snapshot(buf, &buf->cons_snapshot,
&buf->prod_snapshot);
case RING_BUFFER_SNAPSHOT_GET_CONSUMED:
switch (cmd) {
case RING_BUFFER_COMPAT_SNAPSHOT:
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:
return lib_ring_buffer_snapshot(buf, &buf->cons_snapshot,
&buf->prod_snapshot);
case RING_BUFFER_COMPAT_SNAPSHOT_GET_CONSUMED:
return put_u64(stream->version, arg);
}
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;
+ }
return put_u64(stream->version, arg);
}
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;
+ }