X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fcontext.c;h=cd4b85f2a9d576ff828617075e1f305120d69659;hp=c1b7410da00020dc541313326892d850e6810b28;hb=90e7d72ff2b93752b8c81c49e9251a83b01703c6;hpb=0525e9ae15d215943d8187e7f190d5a45e723085 diff --git a/src/bin/lttng-sessiond/context.c b/src/bin/lttng-sessiond/context.c index c1b7410da..cd4b85f2a 100644 --- a/src/bin/lttng-sessiond/context.c +++ b/src/bin/lttng-sessiond/context.c @@ -16,6 +16,7 @@ */ #define _GNU_SOURCE +#define _LGPL_SOURCE #include #include #include @@ -34,7 +35,7 @@ * 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; @@ -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; @@ -92,13 +93,19 @@ static int add_uctx_to_channel(struct ltt_ust_session *usess, int domain, { int ret; struct ltt_ust_context *uctx; - struct lttng_ht_iter iter; - struct lttng_ht_node_ulong *uctx_node; assert(usess); assert(uchan); assert(ctx); + /* Check if context is duplicate */ + cds_list_for_each_entry(uctx, &uchan->ctx_list, list) { + if (trace_ust_match_context(uctx, ctx)) { + ret = -EEXIST; + goto duplicate; + } + } + /* Create ltt UST context */ uctx = trace_ust_create_context(ctx); if (uctx == NULL) { @@ -120,18 +127,10 @@ static int add_uctx_to_channel(struct ltt_ust_session *usess, int domain, rcu_read_lock(); - /* Lookup context before adding it */ - lttng_ht_lookup(uchan->ctx, (void *)((unsigned long)uctx->ctx.ctx), &iter); - uctx_node = lttng_ht_iter_get_node_ulong(&iter); - if (uctx_node != NULL) { - ret = -EEXIST; - rcu_read_unlock(); - goto error; - } - /* Add ltt UST context node to ltt UST channel */ - lttng_ht_add_unique_ulong(uchan->ctx, &uctx->node); + lttng_ht_add_ulong(uchan->ctx, &uctx->node); rcu_read_unlock(); + cds_list_add_tail(&uctx->list, &uchan->ctx_list); DBG("Context UST %d added to channel %s", uctx->ctx.ctx, uchan->name); @@ -139,6 +138,7 @@ static int add_uctx_to_channel(struct ltt_ust_session *usess, int domain, error: free(uctx); +duplicate: return ret; } @@ -150,59 +150,67 @@ 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; - break; - case LTTNG_EVENT_CONTEXT_PERF_COUNTER: - kctx.ctx = LTTNG_KERNEL_CONTEXT_PERF_COUNTER; + 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.ctx = LTTNG_KERNEL_CONTEXT_PERF_CPU_COUNTER; 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 (strlen(channel_name) == 0) { - ret = add_kctx_all_channels(ksession, &kctx); + if (*channel_name == '\0') { + ret = add_kctx_all_channels(ksession, kctx); if (ret != LTTNG_OK) { goto error; } @@ -214,15 +222,18 @@ 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; } @@ -241,6 +252,8 @@ int context_ust_add(struct ltt_ust_session *usess, int domain, assert(ctx); assert(channel_name); + rcu_read_lock(); + /* * Define which channel's hashtable to use from the domain or quit if * unknown domain. @@ -260,7 +273,7 @@ int context_ust_add(struct ltt_ust_session *usess, int domain, } /* Get UST channel if defined */ - if (strlen(channel_name) != 0) { + if (channel_name[0] != '\0') { uchan = trace_ust_find_channel_by_name(chan_ht, channel_name); if (uchan == NULL) { ret = LTTNG_ERR_UST_CHAN_NOT_FOUND; @@ -303,5 +316,6 @@ int context_ust_add(struct ltt_ust_session *usess, int domain, } error: + rcu_read_unlock(); return ret; }