X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fsave.c;h=6cb220c2f28d1e56bffeef8dbf49a68d4cd6d516;hp=2c38df97292fd34fc3619d0c8bdc20d15a1ac1d6;hb=ccf10263bcd2ca4667b9e1fc4dab64a3c8d8c4d8;hpb=da6c3a50492fd90c5dec03183ce504228292bb3b diff --git a/src/bin/lttng-sessiond/save.c b/src/bin/lttng-sessiond/save.c index 2c38df972..6cb220c2f 100644 --- a/src/bin/lttng-sessiond/save.c +++ b/src/bin/lttng-sessiond/save.c @@ -16,6 +16,7 @@ */ #define _GNU_SOURCE +#define _LGPL_SOURCE #include #include #include @@ -31,6 +32,7 @@ #include "save.h" #include "session.h" +#include "syscall.h" #include "trace-ust.h" static @@ -259,8 +261,10 @@ const char *get_ust_context_type_string( context_type_string = config_event_context_pthread_id; break; case LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER: - context_type_string = config_event_context_perf_thread_counter; - break; + /* + * Error, should not be stored in the XML, perf contexts + * are stored as a node of type event_perf_context_type. + */ default: context_type_string = NULL; break; @@ -370,6 +374,7 @@ int save_kernel_event(struct config_writer *writer, } switch (event->event->instrumentation) { + case LTTNG_KERNEL_SYSCALL: case LTTNG_KERNEL_FUNCTION: ret = config_writer_open_element(writer, config_element_function_attributes); @@ -483,9 +488,54 @@ end: return ret; } +static +int save_kernel_syscall(struct config_writer *writer, + struct ltt_kernel_channel *kchan) +{ + int ret, i; + ssize_t count; + struct lttng_event *events = NULL; + + assert(writer); + assert(kchan); + + count = syscall_list_channel(kchan, &events, 0); + if (!count) { + /* No syscalls, just gracefully return. */ + ret = 0; + goto end; + } + + for (i = 0; i < count; i++) { + struct ltt_kernel_event *kevent; + + /* Create a temporary kevent in order to save it. */ + kevent = trace_kernel_create_event(&events[i]); + if (!kevent) { + ret = -ENOMEM; + goto end; + } + /* Init list in order so the destroy call can del the node. */ + CDS_INIT_LIST_HEAD(&kevent->list); + + ret = save_kernel_event(writer, kevent); + trace_kernel_destroy_event(kevent); + if (ret) { + goto end; + } + } + + /* Everything went well */ + ret = 0; + +end: + free(events); + return ret; +} + static int save_kernel_events(struct config_writer *writer, - struct ltt_kernel_event_list *event_list) + struct ltt_kernel_channel *kchan) { int ret; struct ltt_kernel_event *event; @@ -496,13 +546,19 @@ int save_kernel_events(struct config_writer *writer, goto end; } - cds_list_for_each_entry(event, &event_list->head, list) { + cds_list_for_each_entry(event, &kchan->events_list.head, list) { ret = save_kernel_event(writer, event); if (ret) { goto end; } } + /* Save syscalls if any. */ + ret = save_kernel_syscall(writer, kchan); + if (ret) { + goto end; + } + /* /events */ ret = config_writer_close_element(writer); if (ret) { @@ -660,6 +716,8 @@ end: return ret; } +/* TODO: save/restore tracker pid */ + static int save_kernel_context(struct config_writer *writer, struct lttng_kernel_context *ctx) @@ -746,6 +804,11 @@ int save_kernel_contexts(struct config_writer *writer, int ret; struct ltt_kernel_context *ctx; + if (cds_list_empty(&kchan->ctx_list)) { + ret = 0; + goto end; + } + ret = config_writer_open_element(writer, config_element_contexts); if (ret) { ret = LTTNG_ERR_SAVE_IO_FAIL; @@ -788,12 +851,6 @@ int save_ust_context(struct config_writer *writer, cds_list_for_each_entry(ctx, ctx_list, list) { const char *context_type_string; - context_type_string = get_ust_context_type_string(ctx->ctx.ctx); - if (!context_type_string) { - ERR("Unsupported UST context type.") - ret = LTTNG_ERR_INVALID; - goto end; - } ret = config_writer_open_element(writer, config_element_context); @@ -802,11 +859,61 @@ int save_ust_context(struct config_writer *writer, goto end; } - ret = config_writer_write_element_string(writer, - config_element_type, context_type_string); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; - goto end; + if (ctx->ctx.ctx == LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER) { + /* Perf contexts are saved as event_perf_context_type */ + ret = config_writer_open_element(writer, + config_element_perf); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } + + ret = config_writer_write_element_unsigned_int(writer, + config_element_type, + ctx->ctx.u.perf_counter.type); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } + + ret = config_writer_write_element_unsigned_int(writer, + config_element_config, + ctx->ctx.u.perf_counter.config); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } + + ret = config_writer_write_element_string(writer, + config_element_name, + ctx->ctx.u.perf_counter.name); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } + + /* /perf */ + ret = config_writer_close_element(writer); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } + } else { + /* Save context as event_context_type_type */ + context_type_string = get_ust_context_type_string( + ctx->ctx.ctx); + if (!context_type_string) { + ERR("Unsupported UST context type.") + ret = LTTNG_ERR_INVALID; + goto end; + } + + ret = config_writer_write_element_string(writer, + config_element_type, context_type_string); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } } /* /context */ @@ -861,7 +968,7 @@ int save_kernel_channel(struct config_writer *writer, goto end; } - ret = save_kernel_events(writer, &kchan->events_list); + ret = save_kernel_events(writer, kchan); if (ret) { goto end; } @@ -1057,7 +1164,8 @@ int save_ust_session(struct config_writer *writer, ust_chan = caa_container_of(node, struct ltt_ust_channel, node); agent_channel = !strcmp(DEFAULT_JUL_CHANNEL_NAME, ust_chan->name) || - !strcmp(DEFAULT_LOG4J_CHANNEL_NAME, ust_chan->name); + !strcmp(DEFAULT_LOG4J_CHANNEL_NAME, ust_chan->name) || + !strcmp(DEFAULT_PYTHON_CHANNEL_NAME, ust_chan->name); if (!(save_agent ^ agent_channel)) { ret = save_ust_channel(writer, ust_chan, session->ust_session); if (ret) { @@ -1119,6 +1227,8 @@ int save_domains(struct config_writer *writer, struct ltt_session *session) } if (session->ust_session) { + unsigned long agent_count; + ret = config_writer_open_element(writer, config_element_domain); if (ret) { @@ -1137,30 +1247,37 @@ int save_domains(struct config_writer *writer, struct ltt_session *session) ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } - } - if (session->ust_session && - lttng_ht_get_count(session->ust_session->agents) > 0) { - ret = config_writer_open_element(writer, - config_element_domain); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; - goto end; - } + rcu_read_lock(); + agent_count = + lttng_ht_get_count(session->ust_session->agents); + rcu_read_unlock(); - ret = save_ust_session(writer, session, 1); - if (ret) { - goto end; - } + if (agent_count > 0) { + ret = config_writer_open_element(writer, + config_element_domain); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } - /* /domain */ - ret = config_writer_close_element(writer); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; - goto end; + ret = save_ust_session(writer, session, 1); + if (ret) { + goto end; + } + + /* /domain */ + ret = config_writer_close_element(writer); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } } } + if (session->ust_session) { + } + /* /domains */ ret = config_writer_close_element(writer); if (ret) {