From 950131af6bda07be09bc88fe3ecba68ee21e6c26 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Wed, 29 Jun 2011 13:56:29 -0400 Subject: [PATCH] Add disable all support and fix enable all Disable all kernel events support. Fix the enable all kernel events that was not doing the right thing considering the previous changes in the latest commits. Signed-off-by: David Goulet --- ltt-sessiond/main.c | 88 +++++++++++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 22 deletions(-) diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 5a8119f91..d9f7667b1 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -906,6 +906,41 @@ static int process_client_msg(struct command_ctx *cmd_ctx) 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_EVENT: { struct ltt_kernel_channel *chan; @@ -927,11 +962,11 @@ static int process_client_msg(struct command_ctx *cmd_ctx) 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, cmd_ctx->lsm->u.enable.channel_name); + cmd_ctx->lsm->u.enable.event.name, chan->channel->name); ret = kernel_create_event(&cmd_ctx->lsm->u.enable.event, chan); } else { DBG("Enabling kernel event %s for channel %s.", - cmd_ctx->lsm->u.enable.event.name, cmd_ctx->lsm->u.enable.channel_name); + cmd_ctx->lsm->u.enable.event.name, chan->channel->name); ret = kernel_enable_event(ev); } @@ -946,10 +981,11 @@ static int process_client_msg(struct command_ctx *cmd_ctx) } 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); @@ -959,36 +995,44 @@ 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(&ev, chan); - 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 */ + continue; + } } + /* Move pointer to the next line */ ptr += pos + 1; free(event); -- 2.34.1