From: Jérémie Galarneau Date: Tue, 5 May 2020 22:54:32 +0000 (-0400) Subject: sessiond: enforce mmap output type for kernel metadata channel X-Git-Tag: v2.13.0-rc1~634 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=d42266a417afa6e8ca6024590b8282002aebca07;hp=a2814ea7573bf5edd5323d6f89c48ff14105db69 sessiond: enforce mmap output type for kernel metadata channel A follow-up fix causes the consumer daemon to accumulate metadata packets into a complete "unit" that can be parsed before sending it to the relay daemon. The consumer daemon will also need to extract the contents of the metadata cache when computing a rotation position (follow-up fix too). Hence, it is not possible to rely on the splice back-end as the consumer daemon may need to accumulate more content than can be backed by the ring buffer's underlying pages. In both cases, the splice output mode could still be used when combined with a memfd, but I see no tangible benefit. Moreover, it would require a 3.17 kernel. Curiously the kernel metadata channel configuration appears to be hard-coded twice; once in the ltt_kernel_session's ltt_kernel_metadata, and once again in kernel_consumer_add_metadata(). kernel_consumer_add_metadata is modified to use the kernel session's metadata configuration. Signed-off-by: Jérémie Galarneau Change-Id: Ia4cad82f595d3eee50d081851c234d4c2ef7ee5f --- diff --git a/src/bin/lttng-sessiond/kernel-consumer.c b/src/bin/lttng-sessiond/kernel-consumer.c index 9622d3058..6244963cc 100644 --- a/src/bin/lttng-sessiond/kernel-consumer.c +++ b/src/bin/lttng-sessiond/kernel-consumer.c @@ -222,12 +222,23 @@ int kernel_consumer_add_metadata(struct consumer_socket *sock, consumer = ksession->consumer; /* Prep channel message structure */ - consumer_init_add_channel_comm_msg(&lkm, ksession->metadata->key, - ksession->id, "", ksession->uid, ksession->gid, - consumer->net_seq_index, DEFAULT_METADATA_NAME, 1, - DEFAULT_KERNEL_CHANNEL_OUTPUT, - CONSUMER_CHANNEL_TYPE_METADATA, 0, 0, monitor, 0, - ksession->is_live_session, 0, + consumer_init_add_channel_comm_msg(&lkm, + ksession->metadata->key, + ksession->id, + "", + ksession->uid, + ksession->gid, + consumer->net_seq_index, + ksession->metadata->conf->name, + 1, + ksession->metadata->conf->attr.output, + CONSUMER_CHANNEL_TYPE_METADATA, + ksession->metadata->conf->attr.tracefile_size, + ksession->metadata->conf->attr.tracefile_count, + monitor, + ksession->metadata->conf->attr.live_timer_interval, + ksession->is_live_session, + 0, ksession->current_trace_chunk); health_code_update(); diff --git a/src/bin/lttng-sessiond/kernel.c b/src/bin/lttng-sessiond/kernel.c index 53efad5e7..a117575b7 100644 --- a/src/bin/lttng-sessiond/kernel.c +++ b/src/bin/lttng-sessiond/kernel.c @@ -8,6 +8,7 @@ #include "bin/lttng-sessiond/tracker.h" #include "common/tracker.h" #include "common/utils.h" +#include "lttng/event.h" #include "lttng/lttng-error.h" #include "lttng/tracker.h" #define _LGPL_SOURCE diff --git a/src/bin/lttng-sessiond/trace-kernel.c b/src/bin/lttng-sessiond/trace-kernel.c index 723ffddd3..044fc98d2 100644 --- a/src/bin/lttng-sessiond/trace-kernel.c +++ b/src/bin/lttng-sessiond/trace-kernel.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "consumer.h" #include "trace-kernel.h" @@ -485,6 +486,7 @@ error: */ struct ltt_kernel_metadata *trace_kernel_create_metadata(void) { + int ret; struct ltt_kernel_metadata *lkm; struct lttng_channel *chan; @@ -495,13 +497,38 @@ struct ltt_kernel_metadata *trace_kernel_create_metadata(void) goto error; } + ret = lttng_strncpy( + chan->name, DEFAULT_METADATA_NAME, sizeof(chan->name)); + if (ret) { + ERR("Failed to initialize metadata channel name to `%s`", + DEFAULT_METADATA_NAME); + goto error; + } + /* Set default attributes */ - chan->attr.overwrite = DEFAULT_CHANNEL_OVERWRITE; + chan->attr.overwrite = DEFAULT_METADATA_OVERWRITE; chan->attr.subbuf_size = default_get_metadata_subbuf_size(); chan->attr.num_subbuf = DEFAULT_METADATA_SUBBUF_NUM; - chan->attr.switch_timer_interval = DEFAULT_KERNEL_CHANNEL_SWITCH_TIMER; - chan->attr.read_timer_interval = DEFAULT_KERNEL_CHANNEL_READ_TIMER; - chan->attr.output = DEFAULT_KERNEL_CHANNEL_OUTPUT; + chan->attr.switch_timer_interval = DEFAULT_METADATA_SWITCH_TIMER; + chan->attr.read_timer_interval = DEFAULT_METADATA_READ_TIMER;; + + + /* + * The metadata channel of kernel sessions must use the "mmap" + * back-end since the consumer daemon accumulates complete + * metadata units before sending them to the relay daemon in + * live mode. The consumer daemon also needs to extract the contents + * of the metadata cache when computing a rotation position. + * + * In both cases, it is not possible to rely on the splice + * back-end as the consumer daemon may need to accumulate more + * content than can be backed by the ring buffer's underlying + * pages. + */ + chan->attr.output = LTTNG_EVENT_MMAP; + chan->attr.tracefile_size = 0; + chan->attr.tracefile_count = 0; + chan->attr.live_timer_interval = 0; /* Init metadata */ lkm->fd = -1; diff --git a/src/common/defaults.h b/src/common/defaults.h index baf3d5fcc..1e4b7fac7 100644 --- a/src/common/defaults.h +++ b/src/common/defaults.h @@ -210,9 +210,10 @@ #define DEFAULT_METADATA_SUBBUF_SIZE CONFIG_DEFAULT_METADATA_SUBBUF_SIZE #define DEFAULT_METADATA_SUBBUF_NUM CONFIG_DEFAULT_METADATA_SUBBUF_NUM #define DEFAULT_METADATA_CACHE_SIZE CONFIG_DEFAULT_METADATA_CACHE_SIZE -#define DEFAULT_METADATA_SWITCH_TIMER CONFIG_DEFAULT_METADATA_SWITCH_TIMER -#define DEFAULT_METADATA_READ_TIMER CONFIG_DEFAULT_METADATA_READ_TIMER -#define DEFAULT_METADATA_OUTPUT _DEFAULT_CHANNEL_OUTPUT +#define DEFAULT_METADATA_SWITCH_TIMER 0 +#define DEFAULT_METADATA_READ_TIMER 0 +#define DEFAULT_METADATA_OVERWRITE 0 +#define DEFAULT_METADATA_OUTPUT LTTNG_EVENT_MMAP /* Kernel has different defaults */ diff --git a/tests/unit/test_kernel_data.c b/tests/unit/test_kernel_data.c index 322c2eb21..444ae86ae 100644 --- a/tests/unit/test_kernel_data.c +++ b/tests/unit/test_kernel_data.c @@ -81,17 +81,17 @@ static void test_create_kernel_metadata(void) ok(kern->metadata->fd == -1 && kern->metadata->conf != NULL && kern->metadata->conf->attr.overwrite - == DEFAULT_CHANNEL_OVERWRITE && + == DEFAULT_METADATA_OVERWRITE && kern->metadata->conf->attr.subbuf_size == default_get_metadata_subbuf_size() && kern->metadata->conf->attr.num_subbuf == DEFAULT_METADATA_SUBBUF_NUM && kern->metadata->conf->attr.switch_timer_interval - == DEFAULT_KERNEL_CHANNEL_SWITCH_TIMER && + == DEFAULT_METADATA_SWITCH_TIMER && kern->metadata->conf->attr.read_timer_interval - == DEFAULT_KERNEL_CHANNEL_READ_TIMER && + == DEFAULT_METADATA_READ_TIMER && kern->metadata->conf->attr.output - == DEFAULT_KERNEL_CHANNEL_OUTPUT, + == LTTNG_EVENT_MMAP, "Validate kernel session metadata"); trace_kernel_destroy_metadata(kern->metadata);