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.11.5~29 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=17136d8c6c88034daa1f214ee1716c59d6e4fd95;p=lttng-tools.git 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 57c8f549f..a3295e927 100644 --- a/src/bin/lttng-sessiond/kernel-consumer.c +++ b/src/bin/lttng-sessiond/kernel-consumer.c @@ -228,12 +228,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 5fc6ae437..cff8fb25b 100644 --- a/src/bin/lttng-sessiond/kernel.c +++ b/src/bin/lttng-sessiond/kernel.c @@ -16,6 +16,7 @@ */ #define _LGPL_SOURCE + #include #include #include diff --git a/src/bin/lttng-sessiond/trace-kernel.c b/src/bin/lttng-sessiond/trace-kernel.c index e0491c95b..0c472c00f 100644 --- a/src/bin/lttng-sessiond/trace-kernel.c +++ b/src/bin/lttng-sessiond/trace-kernel.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "consumer.h" #include "trace-kernel.h" @@ -465,6 +466,7 @@ error: */ struct ltt_kernel_metadata *trace_kernel_create_metadata(void) { + int ret; struct ltt_kernel_metadata *lkm; struct lttng_channel *chan; @@ -475,13 +477,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 183e31518..78ac2c2d8 100644 --- a/src/common/defaults.h +++ b/src/common/defaults.h @@ -205,9 +205,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 fe6062236..a6c99c858 100644 --- a/tests/unit/test_kernel_data.c +++ b/tests/unit/test_kernel_data.c @@ -92,17 +92,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);