X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Fmain.c;h=c2a4be9af24e76f8d83459480487ccf16f9b3de0;hp=0af4dcdccb7cdb2ec67b2cd423a6f77902687787;hb=f5177a38890d9d7f3324f9bc1d87c9cb77fcc2b3;hpb=052da9399865b26a0212c6668ab424bb3ba37f4b diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 0af4dcdcc..c2a4be9af 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -41,6 +41,7 @@ #include /* URCU list library (-lurcu) */ #include +#include "context.h" #include "liblttsessiondcomm.h" #include "ltt-sessiond.h" #include "lttngerr.h" @@ -1272,11 +1273,11 @@ static int process_client_msg(struct command_ctx *cmd_ctx) case LTTNG_LIST_TRACEPOINTS: break; default: - DBG("Getting session %s by name", cmd_ctx->lsm->session_name); - cmd_ctx->session = find_session_by_name(cmd_ctx->lsm->session_name); + DBG("Getting session %s by name", cmd_ctx->lsm->session.name); + cmd_ctx->session = find_session_by_name(cmd_ctx->lsm->session.name); if (cmd_ctx->session == NULL) { /* If session name not found */ - if (cmd_ctx->lsm->session_name != NULL) { + if (cmd_ctx->lsm->session.name != NULL) { ret = LTTCOMM_SESS_NOT_FOUND; } else { /* If no session name specified */ ret = LTTCOMM_SELECT_SESS; @@ -1293,10 +1294,10 @@ static int process_client_msg(struct command_ctx *cmd_ctx) * Check kernel command for kernel session. */ switch (cmd_ctx->lsm->cmd_type) { - case LTTNG_KERNEL_ADD_CONTEXT: - case LTTNG_KERNEL_DISABLE_ALL_EVENT: - case LTTNG_KERNEL_DISABLE_CHANNEL: - case LTTNG_KERNEL_DISABLE_EVENT: + case LTTNG_ADD_CONTEXT: + case LTTNG_DISABLE_ALL_EVENT: + case LTTNG_DISABLE_CHANNEL: + case LTTNG_DISABLE_EVENT: case LTTNG_KERNEL_ENABLE_ALL_EVENT: case LTTNG_KERNEL_ENABLE_CHANNEL: case LTTNG_KERNEL_ENABLE_EVENT: @@ -1344,12 +1345,9 @@ static int process_client_msg(struct command_ctx *cmd_ctx) /* Process by command type */ switch (cmd_ctx->lsm->cmd_type) { - case LTTNG_KERNEL_ADD_CONTEXT: + case LTTNG_ADD_CONTEXT: { - int found = 0, no_event = 0; - struct ltt_kernel_channel *chan; - struct ltt_kernel_event *event; - struct lttng_kernel_context ctx; + struct lttng_kernel_context kctx; /* Setup lttng message with no payload */ ret = setup_lttng_msg(cmd_ctx, 0); @@ -1357,80 +1355,36 @@ static int process_client_msg(struct command_ctx *cmd_ctx) goto setup_error; } - /* Check if event name is given */ - if (strlen(cmd_ctx->lsm->u.context.event_name) == 0) { - no_event = 1; - } - - /* Create Kernel context */ - ctx.ctx = cmd_ctx->lsm->u.context.ctx.ctx; - ctx.u.perf_counter.type = cmd_ctx->lsm->u.context.ctx.u.perf_counter.type; - ctx.u.perf_counter.config = cmd_ctx->lsm->u.context.ctx.u.perf_counter.config; - strncpy(ctx.u.perf_counter.name, - cmd_ctx->lsm->u.context.ctx.u.perf_counter.name, - sizeof(ctx.u.perf_counter.name)); - - if (strlen(cmd_ctx->lsm->u.context.channel_name) == 0) { - /* Go over all channels */ - DBG("Adding context to all channels"); - cds_list_for_each_entry(chan, - &cmd_ctx->session->kernel_session->channel_list.head, list) { - if (no_event) { - ret = kernel_add_channel_context(chan, &ctx); - if (ret < 0) { - ret = LTTCOMM_KERN_CONTEXT_FAIL; - goto error; - } - } else { - event = get_kernel_event_by_name(cmd_ctx->lsm->u.context.event_name, chan); - if (event != NULL) { - ret = kernel_add_event_context(event, &ctx); - if (ret < 0) { - ret = LTTCOMM_KERN_CONTEXT_FAIL; - goto error; - } - found = 1; - break; - } - } - } - } else { - chan = get_kernel_channel_by_name(cmd_ctx->lsm->u.context.channel_name, - cmd_ctx->session->kernel_session); - if (chan == NULL) { - ret = LTTCOMM_KERN_CHAN_NOT_FOUND; + switch (cmd_ctx->lsm->domain.type) { + case LTTNG_DOMAIN_KERNEL: + /* Create Kernel context */ + kctx.ctx = cmd_ctx->lsm->u.context.ctx.ctx; + kctx.u.perf_counter.type = cmd_ctx->lsm->u.context.ctx.u.perf_counter.type; + kctx.u.perf_counter.config = cmd_ctx->lsm->u.context.ctx.u.perf_counter.config; + strncpy(kctx.u.perf_counter.name, + cmd_ctx->lsm->u.context.ctx.u.perf_counter.name, + LTTNG_SYMBOL_NAME_LEN); + + /* Add kernel context to kernel tracer. See context.c */ + ret = add_kernel_context(cmd_ctx->session->kernel_session, &kctx, + cmd_ctx->lsm->u.context.event_name, + cmd_ctx->lsm->u.context.channel_name); + if (ret != LTTCOMM_OK) { goto error; } - - if (no_event) { - ret = kernel_add_channel_context(chan, &ctx); - if (ret < 0) { - ret = LTTCOMM_KERN_CONTEXT_FAIL; - goto error; - } - } else { - event = get_kernel_event_by_name(cmd_ctx->lsm->u.context.event_name, chan); - if (event != NULL) { - ret = kernel_add_event_context(event, &ctx); - if (ret < 0) { - ret = LTTCOMM_KERN_CONTEXT_FAIL; - goto error; - } - } - } - } - - if (!found && !no_event) { - ret = LTTCOMM_NO_EVENT; + break; + default: + /* TODO: Userspace tracing */ + ret = LTTCOMM_NOT_IMPLEMENTED; goto error; } ret = LTTCOMM_OK; break; } - case LTTNG_KERNEL_DISABLE_CHANNEL: + case LTTNG_DISABLE_CHANNEL: { - struct ltt_kernel_channel *chan; + struct ltt_kernel_channel *kchan; /* Setup lttng message with no payload */ ret = setup_lttng_msg(cmd_ctx, 0); @@ -1438,29 +1392,37 @@ static int process_client_msg(struct command_ctx *cmd_ctx) goto setup_error; } - chan = get_kernel_channel_by_name(cmd_ctx->lsm->u.disable.channel_name, - cmd_ctx->session->kernel_session); - if (chan == NULL) { - ret = LTTCOMM_KERN_CHAN_NOT_FOUND; - goto error; - } else if (chan->enabled == 1) { - ret = kernel_disable_channel(chan); - if (ret < 0) { - if (ret != EEXIST) { - ret = LTTCOMM_KERN_CHAN_DISABLE_FAIL; - } + switch (cmd_ctx->lsm->domain.type) { + case LTTNG_DOMAIN_KERNEL: + kchan = get_kernel_channel_by_name(cmd_ctx->lsm->u.disable.channel_name, + cmd_ctx->session->kernel_session); + if (kchan == NULL) { + ret = LTTCOMM_KERN_CHAN_NOT_FOUND; goto error; + } else if (kchan->enabled == 1) { + ret = kernel_disable_channel(kchan); + if (ret < 0) { + if (ret != EEXIST) { + ret = LTTCOMM_KERN_CHAN_DISABLE_FAIL; + } + goto error; + } } + kernel_wait_quiescent(kernel_tracer_fd); + break; + default: + /* TODO: Userspace tracing */ + ret = LTTCOMM_NOT_IMPLEMENTED; + goto error; } - kernel_wait_quiescent(kernel_tracer_fd); ret = LTTCOMM_OK; break; } - case LTTNG_KERNEL_DISABLE_EVENT: + case LTTNG_DISABLE_EVENT: { - struct ltt_kernel_channel *chan; - struct ltt_kernel_event *ev; + struct ltt_kernel_channel *kchan; + struct ltt_kernel_event *kevent; /* Setup lttng message with no payload */ ret = setup_lttng_msg(cmd_ctx, 0); @@ -1468,32 +1430,41 @@ static int process_client_msg(struct command_ctx *cmd_ctx) goto setup_error; } - chan = get_kernel_channel_by_name(cmd_ctx->lsm->u.disable.channel_name, - cmd_ctx->session->kernel_session); - if (chan == NULL) { - ret = LTTCOMM_KERN_CHAN_NOT_FOUND; - goto error; - } - - ev = get_kernel_event_by_name(cmd_ctx->lsm->u.disable.name, chan); - if (ev != NULL) { - DBG("Disabling kernel event %s for channel %s.", - cmd_ctx->lsm->u.disable.name, cmd_ctx->lsm->u.disable.channel_name); - ret = kernel_disable_event(ev); - if (ret < 0) { - ret = LTTCOMM_KERN_ENABLE_FAIL; + switch (cmd_ctx->lsm->domain.type) { + case LTTNG_DOMAIN_KERNEL: + kchan = get_kernel_channel_by_name(cmd_ctx->lsm->u.disable.channel_name, + cmd_ctx->session->kernel_session); + if (kchan == NULL) { + ret = LTTCOMM_KERN_CHAN_NOT_FOUND; goto error; } + + kevent = get_kernel_event_by_name(cmd_ctx->lsm->u.disable.name, kchan); + if (kevent != NULL) { + DBG("Disabling kernel event %s for channel %s.", kevent->event->name, + kchan->channel->name); + ret = kernel_disable_event(kevent); + if (ret < 0) { + ret = LTTCOMM_KERN_ENABLE_FAIL; + goto error; + } + } + + kernel_wait_quiescent(kernel_tracer_fd); + break; + default: + /* TODO: Userspace tracing */ + ret = LTTCOMM_NOT_IMPLEMENTED; + goto error; } - kernel_wait_quiescent(kernel_tracer_fd); ret = LTTCOMM_OK; break; } - case LTTNG_KERNEL_DISABLE_ALL_EVENT: + case LTTNG_DISABLE_ALL_EVENT: { - struct ltt_kernel_channel *chan; - struct ltt_kernel_event *ev; + struct ltt_kernel_channel *kchan; + struct ltt_kernel_event *kevent; /* Setup lttng message with no payload */ ret = setup_lttng_msg(cmd_ctx, 0); @@ -1501,27 +1472,35 @@ static int process_client_msg(struct command_ctx *cmd_ctx) goto setup_error; } - DBG("Disabling all enabled kernel events"); - - chan = get_kernel_channel_by_name(cmd_ctx->lsm->u.disable.channel_name, - cmd_ctx->session->kernel_session); - if (chan == NULL) { - ret = LTTCOMM_KERN_CHAN_NOT_FOUND; - goto error; - } + switch (cmd_ctx->lsm->domain.type) { + case LTTNG_DOMAIN_KERNEL: + DBG("Disabling all enabled kernel events"); + kchan = get_kernel_channel_by_name(cmd_ctx->lsm->u.disable.channel_name, + cmd_ctx->session->kernel_session); + if (kchan == NULL) { + ret = LTTCOMM_KERN_CHAN_NOT_FOUND; + goto error; + } - /* For each event in the kernel session */ - cds_list_for_each_entry(ev, &chan->events_list.head, list) { - DBG("Disabling kernel event %s for channel %s.", - ev->event->name, cmd_ctx->lsm->u.disable.channel_name); - ret = kernel_disable_event(ev); - if (ret < 0) { - continue; + /* For each event in the kernel session */ + cds_list_for_each_entry(kevent, &kchan->events_list.head, list) { + DBG("Disabling kernel event %s for channel %s.", + kevent->event->name, kchan->channel->name); + ret = kernel_disable_event(kevent); + if (ret < 0) { + continue; + } } + + /* Quiescent wait after event disable */ + kernel_wait_quiescent(kernel_tracer_fd); + break; + default: + /* TODO: Userspace tracing */ + ret = LTTCOMM_NOT_IMPLEMENTED; + goto error; } - /* Quiescent wait after event disable */ - kernel_wait_quiescent(kernel_tracer_fd); ret = LTTCOMM_OK; break; } @@ -1863,7 +1842,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx) goto setup_error; } - ret = create_session(cmd_ctx->lsm->session_name, cmd_ctx->lsm->path); + ret = create_session(cmd_ctx->lsm->session.name, cmd_ctx->lsm->session.path); if (ret < 0) { if (ret == -EEXIST) { ret = LTTCOMM_EXIST_SESS; @@ -1887,7 +1866,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx) /* Clean kernel session teardown */ teardown_kernel_session(cmd_ctx->session); - ret = destroy_session(cmd_ctx->lsm->session_name); + ret = destroy_session(cmd_ctx->lsm->session.name); if (ret < 0) { ret = LTTCOMM_FATAL; goto error;