Use free running metadata channel key between sessiond and kernel consumer
[lttng-tools.git] / src / bin / lttng-sessiond / kernel.c
index f8dcd718fc3cb73ce14d3ce5c5dc84a4a72800e4..47833dc8bd9b7fc011153ed3cfa4109134644504 100644 (file)
 #include "kern-modules.h"
 #include "utils.h"
 
+/*
+ * Key used to reference a channel between the sessiond and the consumer. This
+ * is only read and updated with the session_list lock held.
+ */
+static uint64_t next_kernel_channel_key;
+
 /*
  * Add context on a kernel channel.
  *
@@ -169,8 +175,10 @@ int kernel_create_channel(struct ltt_kernel_session *session,
        cds_list_add(&lkc->list, &session->channel_list.head);
        session->channel_count++;
        lkc->session = session;
+       lkc->key = ++next_kernel_channel_key;
 
-       DBG("Kernel channel %s created (fd: %d)", lkc->channel->name, lkc->fd);
+       DBG("Kernel channel %s created (fd: %d, key: %" PRIu64 ")",
+                       lkc->channel->name, lkc->fd, lkc->key);
 
        return 0;
 
@@ -291,7 +299,8 @@ int kernel_disable_channel(struct ltt_kernel_channel *chan)
        }
 
        chan->enabled = 0;
-       DBG("Kernel channel %s disabled (fd: %d)", chan->channel->name, chan->fd);
+       DBG("Kernel channel %s disabled (fd: %d, key: %" PRIu64 ")",
+                       chan->channel->name, chan->fd, chan->key);
 
        return 0;
 
@@ -315,7 +324,8 @@ int kernel_enable_channel(struct ltt_kernel_channel *chan)
        }
 
        chan->enabled = 1;
-       DBG("Kernel channel %s enabled (fd: %d)", chan->channel->name, chan->fd);
+       DBG("Kernel channel %s enabled (fd: %d, key: %" PRIu64 ")",
+                       chan->channel->name, chan->fd, chan->key);
 
        return 0;
 
@@ -525,6 +535,7 @@ int kernel_open_metadata(struct ltt_kernel_session *session)
        }
 
        lkm->fd = ret;
+       lkm->key = ++next_kernel_channel_key;
        /* Prevent fd duplication after execlp() */
        ret = fcntl(lkm->fd, F_SETFD, FD_CLOEXEC);
        if (ret < 0) {
@@ -1042,7 +1053,7 @@ int kernel_snapshot_record(struct ltt_kernel_session *ksess,
                }
 
                /* Snapshot metadata, */
-               ret = consumer_snapshot_channel(socket, ksess->metadata->fd, output,
+               ret = consumer_snapshot_channel(socket, ksess->metadata->key, output,
                                1, ksess->uid, ksess->gid,
                                DEFAULT_KERNEL_TRACE_DIR, wait, 0);
                if (ret < 0) {
@@ -1139,7 +1150,7 @@ enum lttng_error_code kernel_clear_session(struct ltt_session *session)
        assert(ksess);
        assert(ksess->consumer);
 
-       DBG("Cleat kernel session %s (session %" PRIu64 ")",
+       DBG("Clear kernel session %s (session %" PRIu64 ")",
                        session->name, session->id);
 
        rcu_read_lock();
@@ -1163,6 +1174,15 @@ enum lttng_error_code kernel_clear_session(struct ltt_session *session)
                        }
                }
 
+               if (!ksess->metadata) {
+                       /*
+                        * Nothing to do for the metadata.
+                        * This is a snpashot session.
+                        * The metadata is genererated on the fly.
+                        */
+                       continue;
+               }
+
                /*
                 * Clear the metadata channel.
                 * Metadata channel is not cleared per se but we still need to
This page took 0.025294 seconds and 5 git commands to generate.