#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.
*
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;
}
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;
}
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;
}
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) {
}
/* 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) {
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();
}
}
+ 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