X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=lib%2Fringbuffer%2Fring_buffer_vfs.c;h=71991ebb29554ba9b2df713a73750d6e79acc843;hb=7337bad8813e5d9ec7f37669afb3ec3bf07937da;hp=33dfeaaaba4c5ce55df34ac97b9b812f78d8f565;hpb=d83004aa718065e5221d8ef4b99e4302b70b3df9;p=lttng-modules.git diff --git a/lib/ringbuffer/ring_buffer_vfs.c b/lib/ringbuffer/ring_buffer_vfs.c index 33dfeaaa..71991ebb 100644 --- a/lib/ringbuffer/ring_buffer_vfs.c +++ b/lib/ringbuffer/ring_buffer_vfs.c @@ -28,6 +28,7 @@ #include "../../wrapper/ringbuffer/frontend.h" #include "../../wrapper/ringbuffer/vfs.h" #include "../../wrapper/poll.h" +#include "../../lttng-tracer.h" static int put_ulong(unsigned long val, unsigned long arg) { @@ -41,6 +42,10 @@ static int compat_put_ulong(compat_ulong_t val, unsigned long arg) } #endif +/* + * This is not used by anonymous file descriptors. This code is left + * there if we ever want to implement an inode with open() operation. + */ int lib_ring_buffer_open(struct inode *inode, struct file *file, struct lib_ring_buffer *buf) { @@ -186,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: @@ -263,7 +277,7 @@ long lib_ring_buffer_ioctl(struct file *filp, unsigned int cmd, arg); } case RING_BUFFER_FLUSH: - lib_ring_buffer_switch_slow(buf, SWITCH_ACTIVE); + lib_ring_buffer_switch_remote(buf); return 0; default: return -ENOIOCTLCMD; @@ -315,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: @@ -408,7 +431,7 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, return compat_put_ulong(read_offset, arg); } case RING_BUFFER_COMPAT_FLUSH: - lib_ring_buffer_switch_slow(buf, SWITCH_ACTIVE); + lib_ring_buffer_switch_remote(buf); return 0; default: return -ENOIOCTLCMD; @@ -444,3 +467,7 @@ EXPORT_SYMBOL_GPL(lib_ring_buffer_file_operations); MODULE_LICENSE("GPL and additional rights"); MODULE_AUTHOR("Mathieu Desnoyers"); MODULE_DESCRIPTION("Ring Buffer Library VFS"); +MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "." + __stringify(LTTNG_MODULES_MINOR_VERSION) "." + __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION) + LTTNG_MODULES_EXTRAVERSION);