X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fcontext.c;h=10352d026952ec3361acccf6aa07ac97bab4b34f;hb=645328ae989e5f50a3a49c1ac34b2fee287a3d7b;hp=74afd4e0cad5ff87d307de751672ad1ae86bad61;hpb=601d5acf42ebdb05ff8aa19f12fd9bdad3602781;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/context.c b/src/bin/lttng-sessiond/context.c index 74afd4e0c..10352d026 100644 --- a/src/bin/lttng-sessiond/context.c +++ b/src/bin/lttng-sessiond/context.c @@ -34,11 +34,14 @@ * 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; + assert(ksession); + assert(kctx); + DBG("Adding kernel context to all channels"); /* Go over all channels */ @@ -59,11 +62,14 @@ 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; + assert(kchan); + assert(kctx); + DBG("Add kernel context to channel '%s'", kchan->channel->name); ret = kernel_add_channel_context(kchan, kctx); @@ -86,8 +92,18 @@ 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); @@ -108,16 +124,12 @@ static int add_uctx_to_channel(struct ltt_ust_session *usess, int domain, goto error; } - /* 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; - goto error; - } + rcu_read_lock(); /* 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); @@ -125,6 +137,7 @@ static int add_uctx_to_channel(struct ltt_ust_session *usess, int domain, error: free(uctx); +duplicate: return ret; } @@ -136,55 +149,66 @@ 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; } - 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; } @@ -196,7 +220,7 @@ 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; } @@ -219,6 +243,12 @@ int context_ust_add(struct ltt_ust_session *usess, int domain, struct lttng_ht *chan_ht; struct ltt_ust_channel *uchan = NULL; + assert(usess); + assert(ctx); + assert(channel_name); + + rcu_read_lock(); + /* * Define which channel's hashtable to use from the domain or quit if * unknown domain. @@ -238,7 +268,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; @@ -250,6 +280,7 @@ int context_ust_add(struct ltt_ust_session *usess, int domain, /* Add ctx to channel */ ret = add_uctx_to_channel(usess, domain, uchan, ctx); } else { + rcu_read_lock(); /* Add ctx all events, all channels */ cds_lfht_for_each_entry(chan_ht->ht, &iter.iter, uchan, node.node) { ret = add_uctx_to_channel(usess, domain, uchan, ctx); @@ -258,6 +289,7 @@ int context_ust_add(struct ltt_ust_session *usess, int domain, continue; } } + rcu_read_unlock(); } switch (ret) { @@ -279,5 +311,6 @@ int context_ust_add(struct ltt_ust_session *usess, int domain, } error: + rcu_read_unlock(); return ret; }