Add version info to lttng-tracer.ko modinfo
[lttng-modules.git] / lttng-events.c
index faf3e1f0f8f76785ebcc8b9d0baa170f113817e9..2b2f4cbf034d46e270102789162d2cb01f48d61b 100644 (file)
@@ -31,6 +31,7 @@
 #include "wrapper/vmalloc.h"   /* for wrapper_vmalloc_sync_all() */
 #include "wrapper/random.h"
 #include "wrapper/tracepoint.h"
+#include "lttng-kernel-version.h"
 #include "lttng-events.h"
 #include "lttng-tracer.h"
 #include "lttng-abi-old.h"
@@ -60,9 +61,15 @@ void _lttng_metadata_channel_hangup(struct lttng_metadata_stream *stream);
 void synchronize_trace(void)
 {
        synchronize_sched();
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0))
+#ifdef CONFIG_PREEMPT_RT_FULL
+       synchronize_rcu();
+#endif
+#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) */
 #ifdef CONFIG_PREEMPT_RT
        synchronize_rcu();
 #endif
+#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) */
 }
 
 struct lttng_session *lttng_session_create(void)
@@ -285,6 +292,7 @@ struct lttng_channel *lttng_channel_create(struct lttng_session *session,
                goto nomem;
        chan->session = session;
        chan->id = session->free_chan_id++;
+       chan->ops = &transport->ops;
        /*
         * Note: the channel creation op already writes into the packet
         * headers. Therefore the "chan" information used as input
@@ -296,7 +304,6 @@ struct lttng_channel *lttng_channel_create(struct lttng_session *session,
        if (!chan->chan)
                goto create_error;
        chan->enabled = 1;
-       chan->ops = &transport->ops;
        chan->transport = transport;
        chan->channel_type = channel_type;
        list_add(&chan->list, &session->chan);
@@ -459,6 +466,7 @@ struct lttng_event *lttng_event_create(struct lttng_channel *chan,
                break;
        default:
                WARN_ON_ONCE(1);
+               goto register_error;
        }
        ret = _lttng_event_metadata_statedump(chan->session, chan, event);
        if (ret)
@@ -553,34 +561,46 @@ void _lttng_event_destroy(struct lttng_event *event)
  * sessions_mutex), so we can do racy operations such as looking for
  * remaining space left in packet and write, since mutual exclusion
  * protects us from concurrent writes.
+ * Returns the number of bytes written in the channel, 0 if no data
+ * was written and a negative value on error.
  */
-int lttng_metadata_output_channel(struct lttng_channel *chan,
-               struct lttng_metadata_stream *stream)
+int lttng_metadata_output_channel(struct lttng_metadata_stream *stream,
+               struct channel *chan)
 {
        struct lib_ring_buffer_ctx ctx;
        int ret = 0;
        size_t len, reserve_len;
 
+       /*
+        * Ensure we support mutiple get_next / put sequences followed
+        * by put_next.
+        */
+       WARN_ON(stream->metadata_in < stream->metadata_out);
+       if (stream->metadata_in != stream->metadata_out)
+               return 0;
+
        len = stream->metadata_cache->metadata_written -
-               stream->metadata_cache_read;
+               stream->metadata_in;
+       if (!len)
+               return 0;
        reserve_len = min_t(size_t,
-                       chan->ops->packet_avail_size(chan->chan),
+                       stream->transport->ops.packet_avail_size(chan),
                        len);
-       lib_ring_buffer_ctx_init(&ctx, chan->chan, NULL, reserve_len,
+       lib_ring_buffer_ctx_init(&ctx, chan, NULL, reserve_len,
                        sizeof(char), -1);
        /*
         * If reservation failed, return an error to the caller.
         */
-       ret = chan->ops->event_reserve(&ctx, 0);
+       ret = stream->transport->ops.event_reserve(&ctx, 0);
        if (ret != 0) {
                printk(KERN_WARNING "LTTng: Metadata event reservation failed\n");
                goto end;
        }
-       chan->ops->event_write(&ctx,
-                       stream->metadata_cache->data + stream->metadata_cache_read,
+       stream->transport->ops.event_write(&ctx,
+                       stream->metadata_cache->data + stream->metadata_in,
                        reserve_len);
-       chan->ops->event_commit(&ctx);
-       stream->metadata_cache_read += reserve_len;
+       stream->transport->ops.event_commit(&ctx);
+       stream->metadata_in += reserve_len;
        ret = reserve_len;
 
 end:
@@ -1240,3 +1260,6 @@ module_exit(lttng_events_exit);
 MODULE_LICENSE("GPL and additional rights");
 MODULE_AUTHOR("Mathieu Desnoyers <mathieu.desnoyers@efficios.com>");
 MODULE_DESCRIPTION("LTTng Events");
+MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "."
+       __stringify(LTTNG_MODULES_MINOR_VERSION) "."
+       __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION));
This page took 0.024944 seconds and 4 git commands to generate.