X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fkernel.c;h=47833dc8bd9b7fc011153ed3cfa4109134644504;hb=2b5f1a27dceffd016755c0a62c9686c3b61f6aaa;hp=f8dcd718fc3cb73ce14d3ce5c5dc84a4a72800e4;hpb=38cd0ad9f99bedeffd9fa659943f1fe050b7a16a;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/kernel.c b/src/bin/lttng-sessiond/kernel.c index f8dcd718f..47833dc8b 100644 --- a/src/bin/lttng-sessiond/kernel.c +++ b/src/bin/lttng-sessiond/kernel.c @@ -34,6 +34,12 @@ #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