X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Fmain.c;h=92e41b1c6aff91b1573843079cfd3420b38dc275;hp=46e6fff454e66aa7dd091fb8a49edadc1d008c53;hb=b9f1dd6997ea64db8c140c617d2a74cf90767e3b;hpb=f3ed775ef4842019b396f06095b053c3a70bc3c8 diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 46e6fff45..92e41b1c6 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -1,7 +1,4 @@ /* - DBG("Creating kernel event %s for channel %s.", - cmd_ctx->lsm->u.enable.event.name, cmd_ctx->lsm->u.enable.channel_name); - * Copyright (C) 2011 - David Goulet * * This program is free software; you can redistribute it and/or @@ -723,6 +720,7 @@ static struct lttng_channel *init_default_channel(void) chan->attr.num_subbuf = DEFAULT_CHANNEL_SUBBUF_NUM; chan->attr.switch_timer_interval = DEFAULT_CHANNEL_SWITCH_TIMER; chan->attr.read_timer_interval = DEFAULT_CHANNEL_READ_TIMER; + chan->attr.output = DEFAULT_CHANNEL_OUTPUT; error: return chan; @@ -806,6 +804,7 @@ 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_CREATE_CHANNEL: case LTTNG_KERNEL_DISABLE_ALL_EVENT: case LTTNG_KERNEL_DISABLE_CHANNEL: @@ -826,12 +825,14 @@ static int process_client_msg(struct command_ctx *cmd_ctx) /* Need a session for kernel command */ if (cmd_ctx->lsm->cmd_type != LTTNG_KERNEL_LIST_EVENTS && cmd_ctx->session->kernel_session == NULL) { + ret = create_kernel_session(cmd_ctx->session); if (ret < 0) { ret = LTTCOMM_KERN_SESS_FAIL; goto error; } + /* Start the kernel consumer daemon */ if (kconsumerd_pid == 0) { ret = start_kconsumerd(); if (ret < 0) { @@ -853,6 +854,84 @@ 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: + { + int found = 0, no_event = 0; + struct ltt_kernel_channel *chan; + struct ltt_kernel_event *event; + + /* Setup lttng message with no payload */ + ret = setup_lttng_msg(cmd_ctx, 0); + if (ret < 0) { + goto setup_error; + } + + /* Check if event name is given */ + if (strlen(cmd_ctx->lsm->u.context.event_name) == 0) { + no_event = 1; + } + + 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, + &cmd_ctx->lsm->u.context.ctx); + if (ret < 0) { + continue; + } + } else { + event = get_kernel_event_by_name(cmd_ctx->lsm->u.context.event_name, chan); + if (event != NULL) { + ret = kernel_add_event_context(event, + &cmd_ctx->lsm->u.context.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; + goto error; + } + + if (no_event) { + ret = kernel_add_channel_context(chan, + &cmd_ctx->lsm->u.context.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, + &cmd_ctx->lsm->u.context.ctx); + if (ret < 0) { + ret = LTTCOMM_KERN_CONTEXT_FAIL; + goto error; + } + } + } + } + + if (!found && !no_event) { + ret = LTTCOMM_NO_EVENT; + goto error; + } + + ret = LTTCOMM_OK; + break; + } case LTTNG_KERNEL_CREATE_CHANNEL: { /* Setup lttng message with no payload */ @@ -874,9 +953,8 @@ static int process_client_msg(struct command_ctx *cmd_ctx) ret = LTTCOMM_OK; break; } - case LTTNG_KERNEL_ENABLE_EVENT: + case LTTNG_KERNEL_DISABLE_CHANNEL: { - int found = 0; struct ltt_kernel_channel *chan; /* Setup lttng message with no payload */ @@ -885,36 +963,167 @@ static int process_client_msg(struct command_ctx *cmd_ctx) goto setup_error; } - /* Get channel by name and create event for that channel */ - cds_list_for_each_entry(chan, &cmd_ctx->session->kernel_session->channel_list.head, list) { - if (strcmp(cmd_ctx->lsm->u.enable.channel_name, chan->channel->name) == 0) { - DBG("Creating kernel event %s for channel %s.", - cmd_ctx->lsm->u.enable.event.name, cmd_ctx->lsm->u.enable.channel_name); + 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; + } + goto error; + } + } - ret = kernel_create_event(chan, &cmd_ctx->lsm->u.enable.event); - if (ret < 0) { - ret = LTTCOMM_KERN_ENABLE_FAIL; - goto error; + kernel_wait_quiescent(kernel_tracer_fd); + ret = LTTCOMM_OK; + break; + } + case LTTNG_KERNEL_DISABLE_EVENT: + { + struct ltt_kernel_channel *chan; + struct ltt_kernel_event *ev; + + /* Setup lttng message with no payload */ + ret = setup_lttng_msg(cmd_ctx, 0); + if (ret < 0) { + 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; + goto error; + } + } + + kernel_wait_quiescent(kernel_tracer_fd); + ret = LTTCOMM_OK; + break; + } + case LTTNG_KERNEL_DISABLE_ALL_EVENT: + { + struct ltt_kernel_channel *chan; + struct ltt_kernel_event *ev; + + /* Setup lttng message with no payload */ + ret = setup_lttng_msg(cmd_ctx, 0); + if (ret < 0) { + 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; + } + + /* 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; + } + } + + /* Quiescent wait after event disable */ + kernel_wait_quiescent(kernel_tracer_fd); + ret = LTTCOMM_OK; + break; + } + case LTTNG_KERNEL_ENABLE_CHANNEL: + { + struct ltt_kernel_channel *chan; + + /* Setup lttng message with no payload */ + ret = setup_lttng_msg(cmd_ctx, 0); + if (ret < 0) { + goto setup_error; + } + + chan = get_kernel_channel_by_name(cmd_ctx->lsm->u.enable.channel_name, + cmd_ctx->session->kernel_session); + if (chan == NULL) { + ret = LTTCOMM_KERN_CHAN_NOT_FOUND; + goto error; + } else if (chan->enabled == 0) { + ret = kernel_enable_channel(chan); + if (ret < 0) { + if (ret != EEXIST) { + ret = LTTCOMM_KERN_CHAN_ENABLE_FAIL; } - found = 1; - break; + goto error; } } - if (!found) { + kernel_wait_quiescent(kernel_tracer_fd); + ret = LTTCOMM_OK; + break; + } + case LTTNG_KERNEL_ENABLE_EVENT: + { + struct ltt_kernel_channel *chan; + struct ltt_kernel_event *ev; + + /* Setup lttng message with no payload */ + ret = setup_lttng_msg(cmd_ctx, 0); + if (ret < 0) { + goto setup_error; + } + + chan = get_kernel_channel_by_name(cmd_ctx->lsm->u.enable.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.enable.event.name, chan); + if (ev == NULL) { + DBG("Creating kernel event %s for channel %s.", + cmd_ctx->lsm->u.enable.event.name, chan->channel->name); + ret = kernel_create_event(&cmd_ctx->lsm->u.enable.event, chan); } else { - kernel_wait_quiescent(kernel_tracer_fd); - ret = LTTCOMM_OK; + DBG("Enabling kernel event %s for channel %s.", + cmd_ctx->lsm->u.enable.event.name, chan->channel->name); + ret = kernel_enable_event(ev); + } + + if (ret < 0) { + ret = LTTCOMM_KERN_ENABLE_FAIL; + goto error; } + + kernel_wait_quiescent(kernel_tracer_fd); + ret = LTTCOMM_OK; break; } case LTTNG_KERNEL_ENABLE_ALL_EVENT: { - int pos, size, found; + int pos, size; char *event_list, *event, *ptr; struct ltt_kernel_channel *chan; - struct lttng_event ev; + struct ltt_kernel_event *ev; + struct lttng_event ev_attr; /* Setup lttng message with no payload */ ret = setup_lttng_msg(cmd_ctx, 0); @@ -924,36 +1133,43 @@ static int process_client_msg(struct command_ctx *cmd_ctx) DBG("Enabling all kernel event"); - size = kernel_list_events(kernel_tracer_fd, &event_list); - if (size < 0) { - ret = LTTCOMM_KERN_LIST_FAIL; + chan = get_kernel_channel_by_name(cmd_ctx->lsm->u.enable.channel_name, + cmd_ctx->session->kernel_session); + if (chan == NULL) { + ret = LTTCOMM_KERN_CHAN_NOT_FOUND; goto error; } - /* Get channel by name and create event for that channel */ - cds_list_for_each_entry(chan, &cmd_ctx->session->kernel_session->channel_list.head, list) { - if (strcmp(cmd_ctx->lsm->u.enable.channel_name, chan->channel->name) == 0) { - found = 1; - break; + /* For each event in the kernel session */ + cds_list_for_each_entry(ev, &chan->events_list.head, list) { + DBG("Enabling kernel event %s for channel %s.", + ev->event->name, chan->channel->name); + ret = kernel_enable_event(ev); + if (ret < 0) { + continue; } } - if (!found) { - ret = LTTCOMM_KERN_CHAN_NOT_FOUND; + size = kernel_list_events(kernel_tracer_fd, &event_list); + if (size < 0) { + ret = LTTCOMM_KERN_LIST_FAIL; goto error; } ptr = event_list; while ((size = sscanf(ptr, "event { name = %m[^;]; };%n\n", &event, &pos)) == 1) { - strncpy(ev.name, event, LTTNG_SYM_NAME_LEN); - /* Default event type for enable all */ - ev.type = LTTNG_EVENT_TRACEPOINTS; - /* Enable each single tracepoint event */ - ret = kernel_create_event(chan, &ev); - if (ret < 0) { - ret = LTTCOMM_KERN_ENABLE_FAIL; - goto error; + ev = get_kernel_event_by_name(event, chan); + if (ev == NULL) { + strncpy(ev_attr.name, event, LTTNG_SYM_NAME_LEN); + /* Default event type for enable all */ + ev_attr.type = LTTNG_EVENT_TRACEPOINTS; + /* Enable each single tracepoint event */ + ret = kernel_create_event(&ev_attr, chan); + if (ret < 0) { + /* Ignore error here and continue */ + } } + /* Move pointer to the next line */ ptr += pos + 1; free(event);