Fix: blktrace instrumentation for v3.2.58+ stable branch
[lttng-modules.git] / lttng-ring-buffer-metadata-client.h
index bb91f4d4aaa4a049af5adf40a483f43afefb15bb..f077f4f6c523b56f2c20337a893afa25827037eb 100644 (file)
@@ -26,6 +26,8 @@
 #include "lttng-events.h"
 #include "lttng-tracer.h"
 
+static struct lttng_transport lttng_relay_transport;
+
 struct metadata_packet_header {
        uint32_t magic;                 /* 0x75D11D57 */
        uint8_t  uuid[16];              /* Unique Universal Identifier */
@@ -216,6 +218,18 @@ static const struct lib_ring_buffer_config client_config = {
        .wakeup = RING_BUFFER_WAKEUP_BY_TIMER,
 };
 
+static
+void release_priv_ops(void *priv_ops)
+{
+       module_put(THIS_MODULE);
+}
+
+static
+void lttng_channel_destroy(struct channel *chan)
+{
+       channel_destroy(chan);
+}
+
 static
 struct channel *_channel_create(const char *name,
                                struct lttng_channel *lttng_chan, void *buf_addr,
@@ -223,15 +237,28 @@ struct channel *_channel_create(const char *name,
                                unsigned int switch_timer_interval,
                                unsigned int read_timer_interval)
 {
-       return channel_create(&client_config, name, lttng_chan, buf_addr,
+       struct channel *chan;
+
+       chan = channel_create(&client_config, name, lttng_chan, buf_addr,
                              subbuf_size, num_subbuf, switch_timer_interval,
                              read_timer_interval);
-}
+       if (chan) {
+               /*
+                * Ensure this module is not unloaded before we finish
+                * using lttng_relay_transport.ops.
+                */
+               if (!try_module_get(THIS_MODULE)) {
+                       printk(KERN_WARNING "LTT : Can't lock transport module.\n");
+                       goto error;
+               }
+               chan->backend.priv_ops = &lttng_relay_transport.ops;
+               chan->backend.release_priv_ops = release_priv_ops;
+       }
+       return chan;
 
-static
-void lttng_channel_destroy(struct channel *chan)
-{
-       channel_destroy(chan);
+error:
+       lttng_channel_destroy(chan);
+       return NULL;
 }
 
 static
@@ -298,6 +325,13 @@ void lttng_event_memset(struct lib_ring_buffer_ctx *ctx,
        lib_ring_buffer_memset(&client_config, ctx, c, len);
 }
 
+static
+void lttng_event_strcpy(struct lib_ring_buffer_ctx *ctx, const char *src,
+               size_t len)
+{
+       lib_ring_buffer_strcpy(&client_config, ctx, src, len, '#');
+}
+
 static
 size_t lttng_packet_avail_size(struct channel *chan)
                             
@@ -356,6 +390,7 @@ static struct lttng_transport lttng_relay_transport = {
                .event_write_from_user = lttng_event_write_from_user,
                .event_memset = lttng_event_memset,
                .event_write = lttng_event_write,
+               .event_strcpy = lttng_event_strcpy,
                .packet_avail_size = lttng_packet_avail_size,
                .get_writer_buf_wait_queue = lttng_get_writer_buf_wait_queue,
                .get_hp_wait_queue = lttng_get_hp_wait_queue,
This page took 0.026646 seconds and 4 git commands to generate.