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
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);
/*
}
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
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:
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 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;
}
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;
}