X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fcontext.c;h=9c3a394edbcb7e8e37bb379ebbdbea2e1f915876;hp=1b87df2e90ab03a3d95192a5afc102fc21404397;hb=287a512f2b868c16132b894a8143a5faf0379ca8;hpb=aa3514e96f12c13f681a81ea275dc51dd63473c8 diff --git a/src/bin/lttng-sessiond/context.c b/src/bin/lttng-sessiond/context.c index 1b87df2e9..9c3a394ed 100644 --- a/src/bin/lttng-sessiond/context.c +++ b/src/bin/lttng-sessiond/context.c @@ -1,5 +1,6 @@ /* - * Copyright (C) 2011 - David Goulet + * Copyright (C) 2011 - David Goulet + * Copyright (C) 2016 - Jérémie Galarneau * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2 only, @@ -15,7 +16,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#define _GNU_SOURCE +#define _LGPL_SOURCE #include #include #include @@ -29,12 +30,13 @@ #include "kernel.h" #include "ust-app.h" #include "trace-ust.h" +#include "agent.h" /* * Add kernel context to all channel. */ static int add_kctx_all_channels(struct ltt_kernel_session *ksession, - struct lttng_kernel_context *kctx) + struct ltt_kernel_context *kctx) { int ret; struct ltt_kernel_channel *kchan; @@ -47,8 +49,7 @@ static int add_kctx_all_channels(struct ltt_kernel_session *ksession, /* Go over all channels */ cds_list_for_each_entry(kchan, &ksession->channel_list.head, list) { ret = kernel_add_channel_context(kchan, kctx); - if (ret < 0) { - ret = LTTNG_ERR_KERN_CONTEXT_FAIL; + if (ret != 0) { goto error; } } @@ -62,7 +63,7 @@ error: /* * Add kernel context to a specific channel. */ -static int add_kctx_to_channel(struct lttng_kernel_context *kctx, +static int add_kctx_to_channel(struct ltt_kernel_context *kctx, struct ltt_kernel_channel *kchan) { int ret; @@ -73,8 +74,7 @@ static int add_kctx_to_channel(struct lttng_kernel_context *kctx, DBG("Add kernel context to channel '%s'", kchan->channel->name); ret = kernel_add_channel_context(kchan, kctx); - if (ret < 0) { - ret = LTTNG_ERR_KERN_CONTEXT_FAIL; + if (ret != 0) { goto error; } @@ -87,11 +87,12 @@ error: /* * Add UST context to channel. */ -static int add_uctx_to_channel(struct ltt_ust_session *usess, int domain, +static int add_uctx_to_channel(struct ltt_ust_session *usess, + enum lttng_domain_type domain, struct ltt_ust_channel *uchan, struct lttng_event_context *ctx) { int ret; - struct ltt_ust_context *uctx; + struct ltt_ust_context *uctx = NULL; assert(usess); assert(uchan); @@ -104,6 +105,44 @@ static int add_uctx_to_channel(struct ltt_ust_session *usess, int domain, goto duplicate; } } + uctx = NULL; + + switch (domain) { + case LTTNG_DOMAIN_JUL: + case LTTNG_DOMAIN_LOG4J: + { + struct agent *agt; + + if (ctx->ctx != LTTNG_EVENT_CONTEXT_APP_CONTEXT) { + /* Other contexts are not needed by the agent. */ + break; + } + agt = trace_ust_find_agent(usess, domain); + + if (!agt) { + agt = agent_create(domain); + if (!agt) { + ret = LTTNG_ERR_NOMEM; + goto error; + } + agent_add(agt, usess->agents); + } + ret = agent_add_context(ctx, agt); + if (ret != LTTNG_OK) { + goto error; + } + + ret = agent_enable_context(ctx, domain); + if (ret != LTTNG_OK) { + goto error; + } + break; + } + case LTTNG_DOMAIN_UST: + break; + default: + assert(0); + } /* Create ltt UST context */ uctx = trace_ust_create_context(ctx); @@ -112,15 +151,8 @@ static int add_uctx_to_channel(struct ltt_ust_session *usess, int domain, goto error; } - switch (domain) { - case LTTNG_DOMAIN_UST: - ret = ust_app_add_ctx_channel_glb(usess, uchan, uctx); - if (ret < 0) { - goto error; - } - break; - default: - ret = -ENOSYS; + ret = ust_app_add_ctx_channel_glb(usess, uchan, uctx); + if (ret < 0) { goto error; } @@ -149,60 +181,79 @@ int context_kernel_add(struct ltt_kernel_session *ksession, { int ret; struct ltt_kernel_channel *kchan; - struct lttng_kernel_context kctx; + struct ltt_kernel_context *kctx; assert(ksession); assert(ctx); assert(channel_name); + kctx = trace_kernel_create_context(NULL); + if (!kctx) { + ret = LTTNG_ERR_NOMEM; + goto error; + } + /* Setup kernel context structure */ switch (ctx->ctx) { case LTTNG_EVENT_CONTEXT_PID: - kctx.ctx = LTTNG_KERNEL_CONTEXT_PID; + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_PID; break; case LTTNG_EVENT_CONTEXT_PROCNAME: - kctx.ctx = LTTNG_KERNEL_CONTEXT_PROCNAME; + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_PROCNAME; break; case LTTNG_EVENT_CONTEXT_PRIO: - kctx.ctx = LTTNG_KERNEL_CONTEXT_PRIO; + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_PRIO; break; case LTTNG_EVENT_CONTEXT_NICE: - kctx.ctx = LTTNG_KERNEL_CONTEXT_NICE; + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_NICE; break; case LTTNG_EVENT_CONTEXT_VPID: - kctx.ctx = LTTNG_KERNEL_CONTEXT_VPID; + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_VPID; break; case LTTNG_EVENT_CONTEXT_TID: - kctx.ctx = LTTNG_KERNEL_CONTEXT_TID; + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_TID; break; case LTTNG_EVENT_CONTEXT_VTID: - kctx.ctx = LTTNG_KERNEL_CONTEXT_VTID; + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_VTID; break; case LTTNG_EVENT_CONTEXT_PPID: - kctx.ctx = LTTNG_KERNEL_CONTEXT_PPID; + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_PPID; break; case LTTNG_EVENT_CONTEXT_VPPID: - kctx.ctx = LTTNG_KERNEL_CONTEXT_VPPID; + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_VPPID; break; case LTTNG_EVENT_CONTEXT_HOSTNAME: - kctx.ctx = LTTNG_KERNEL_CONTEXT_HOSTNAME; + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_HOSTNAME; break; case LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER: case LTTNG_EVENT_CONTEXT_PERF_COUNTER: - kctx.ctx = LTTNG_KERNEL_CONTEXT_PERF_CPU_COUNTER; + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_PERF_CPU_COUNTER; + break; + case LTTNG_EVENT_CONTEXT_INTERRUPTIBLE: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_INTERRUPTIBLE; + break; + case LTTNG_EVENT_CONTEXT_PREEMPTIBLE: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_PREEMPTIBLE; + break; + case LTTNG_EVENT_CONTEXT_NEED_RESCHEDULE: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_NEED_RESCHEDULE; + break; + case LTTNG_EVENT_CONTEXT_MIGRATABLE: + kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_MIGRATABLE; break; default: - return LTTNG_ERR_KERN_CONTEXT_FAIL; + ret = LTTNG_ERR_KERN_CONTEXT_FAIL; + goto error; } - kctx.u.perf_counter.type = ctx->u.perf_counter.type; - kctx.u.perf_counter.config = ctx->u.perf_counter.config; - strncpy(kctx.u.perf_counter.name, ctx->u.perf_counter.name, + kctx->ctx.u.perf_counter.type = ctx->u.perf_counter.type; + kctx->ctx.u.perf_counter.config = ctx->u.perf_counter.config; + strncpy(kctx->ctx.u.perf_counter.name, ctx->u.perf_counter.name, LTTNG_SYMBOL_NAME_LEN); - kctx.u.perf_counter.name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0'; + kctx->ctx.u.perf_counter.name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0'; if (*channel_name == '\0') { - ret = add_kctx_all_channels(ksession, &kctx); + ret = add_kctx_all_channels(ksession, kctx); if (ret != LTTNG_OK) { goto error; } @@ -214,23 +265,27 @@ int context_kernel_add(struct ltt_kernel_session *ksession, goto error; } - ret = add_kctx_to_channel(&kctx, kchan); + ret = add_kctx_to_channel(kctx, kchan); if (ret != LTTNG_OK) { goto error; } } - ret = LTTNG_OK; + return LTTNG_OK; error: + if (kctx) { + trace_kernel_destroy_context(kctx); + } return ret; } /* * Add UST context to tracer. */ -int context_ust_add(struct ltt_ust_session *usess, int domain, - struct lttng_event_context *ctx, char *channel_name) +int context_ust_add(struct ltt_ust_session *usess, + enum lttng_domain_type domain, struct lttng_event_context *ctx, + char *channel_name) { int ret = LTTNG_OK; struct lttng_ht_iter iter; @@ -243,23 +298,7 @@ int context_ust_add(struct ltt_ust_session *usess, int domain, rcu_read_lock(); - /* - * Define which channel's hashtable to use from the domain or quit if - * unknown domain. - */ - switch (domain) { - case LTTNG_DOMAIN_UST: - chan_ht = usess->domain_global.channels; - break; -#if 0 - case LTTNG_DOMAIN_UST_EXEC_NAME: - case LTTNG_DOMAIN_UST_PID: - case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN: -#endif - default: - ret = LTTNG_ERR_UND; - goto error; - } + chan_ht = usess->domain_global.channels; /* Get UST channel if defined */ if (channel_name[0] != '\0') { @@ -279,7 +318,8 @@ int context_ust_add(struct ltt_ust_session *usess, int domain, cds_lfht_for_each_entry(chan_ht->ht, &iter.iter, uchan, node.node) { ret = add_uctx_to_channel(usess, domain, uchan, ctx); if (ret < 0) { - ERR("Context failed for channel %s", uchan->name); + ERR("Failed to add context to channel %s", + uchan->name); continue; } }