X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fcontext.c;h=1e68bd8bb9ff2b9090146da82c36e8c90104a4c5;hb=b0c07e45528c4ba3c306c780261a9d54bacd94e6;hp=1725c6a107d429616b09dab83d01623ba722ad2a;hpb=bdf640139afb02572eb23f014e4a61ad68fdfeb1;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/context.c b/src/bin/lttng-sessiond/context.c index 1725c6a10..1e68bd8bb 100644 --- a/src/bin/lttng-sessiond/context.c +++ b/src/bin/lttng-sessiond/context.c @@ -34,6 +34,8 @@ /* * Add kernel context to all channel. + * + * Assumes the ownership of kctx. */ static int add_kctx_all_channels(struct ltt_kernel_session *ksession, struct ltt_kernel_context *kctx) @@ -48,9 +50,19 @@ 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; + struct ltt_kernel_context *kctx_copy; + + kctx_copy = trace_kernel_copy_context(kctx); + if (!kctx_copy) { + PERROR("zmalloc ltt_kernel_context"); + ret = -ENOMEM; + goto error; + } + + /* Ownership of kctx_copy is transferred to the callee. */ + ret = kernel_add_channel_context(kchan, kctx_copy); + kctx_copy = NULL; + if (ret != 0) { goto error; } } @@ -58,11 +70,14 @@ static int add_kctx_all_channels(struct ltt_kernel_session *ksession, ret = LTTNG_OK; error: + trace_kernel_destroy_context(kctx); return ret; } /* * Add kernel context to a specific channel. + * + * Assumes the ownership of kctx. */ static int add_kctx_to_channel(struct ltt_kernel_context *kctx, struct ltt_kernel_channel *kchan) @@ -74,9 +89,10 @@ static int add_kctx_to_channel(struct ltt_kernel_context *kctx, DBG("Add kernel context to channel '%s'", kchan->channel->name); + /* Ownership of kctx is transferred to the callee. */ ret = kernel_add_channel_context(kchan, kctx); - if (ret < 0) { - ret = LTTNG_ERR_KERN_CONTEXT_FAIL; + kctx = NULL; + if (ret != 0) { goto error; } @@ -113,7 +129,13 @@ static int add_uctx_to_channel(struct ltt_ust_session *usess, case LTTNG_DOMAIN_JUL: case LTTNG_DOMAIN_LOG4J: { - struct agent *agt = trace_ust_find_agent(usess, domain); + 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); @@ -225,6 +247,18 @@ int context_kernel_add(struct ltt_kernel_session *ksession, case LTTNG_EVENT_CONTEXT_PERF_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: ret = LTTNG_ERR_KERN_CONTEXT_FAIL; goto error; @@ -238,6 +272,8 @@ int context_kernel_add(struct ltt_kernel_session *ksession, if (*channel_name == '\0') { ret = add_kctx_all_channels(ksession, kctx); + /* Ownership of kctx is transferred to the callee. */ + kctx = NULL; if (ret != LTTNG_OK) { goto error; } @@ -250,12 +286,14 @@ int context_kernel_add(struct ltt_kernel_session *ksession, } ret = add_kctx_to_channel(kctx, kchan); + /* Ownership of kctx is transferred to the callee. */ + kctx = NULL; if (ret != LTTNG_OK) { goto error; } } - return LTTNG_OK; + ret = LTTNG_OK; error: if (kctx) {