X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt-sessiond%2Fmain.c;h=153b215c08c0277f31930afbe86ad95193689665;hb=2269e89ed1579f2d4fb0bc9a801af03c5c39fa52;hp=b53eeb0e7a84219c17ece8b1dfab0ce349c83d00;hpb=d980092014bba68425b9c63a020bfbc034dc9ad1;p=lttng-tools.git diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index b53eeb0e7..153b215c0 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -41,6 +41,7 @@ #include /* URCU list library (-lurcu) */ #include +#include #include #include "context.h" @@ -50,7 +51,7 @@ #include "ust-ctl.h" #include "session.h" #include "traceable-app.h" -#include "lttng-kconsumerd.h" +#include "ltt-kconsumerd.h" #include "utils.h" /* Const values */ @@ -297,7 +298,7 @@ static int send_kconsumerd_channel_fds(int sock, struct ltt_kernel_channel *chan lkm.fd = stream->fd; lkm.state = stream->state; lkm.max_sb_size = channel->channel->attr.subbuf_size; - lkm.output = DEFAULT_KERNEL_CHANNEL_OUTPUT; + lkm.output = channel->channel->attr.output; strncpy(lkm.path_name, stream->pathname, PATH_MAX); lkm.path_name[PATH_MAX - 1] = '\0'; @@ -1240,7 +1241,8 @@ static int notify_kernel_pollfd(void) /* * Allocate a channel structure and fill it. */ -static struct lttng_channel *init_default_channel(char *name) +static struct lttng_channel *init_default_channel(enum lttng_domain_type domain_type, + char *name) { struct lttng_channel *chan; @@ -1252,18 +1254,29 @@ static struct lttng_channel *init_default_channel(char *name) if (snprintf(chan->name, NAME_MAX, "%s", name) < 0) { perror("snprintf channel name"); - return NULL; + goto error; } chan->attr.overwrite = DEFAULT_CHANNEL_OVERWRITE; - chan->attr.subbuf_size = DEFAULT_CHANNEL_SUBBUF_SIZE; - 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_KERNEL_CHANNEL_OUTPUT; -error: + switch (domain_type) { + case LTTNG_DOMAIN_KERNEL: + chan->attr.subbuf_size = DEFAULT_KERNEL_CHANNEL_SUBBUF_SIZE; + chan->attr.num_subbuf = DEFAULT_KERNEL_CHANNEL_SUBBUF_NUM; + chan->attr.output = DEFAULT_KERNEL_CHANNEL_OUTPUT; + break; + /* TODO: add UST */ + default: + goto error; /* Not implemented */ + } + return chan; + +error: + free(chan); + return NULL; } /* @@ -1712,26 +1725,32 @@ static int process_client_msg(struct command_ctx *cmd_ctx) switch (cmd_ctx->lsm->domain.type) { case LTTNG_DOMAIN_KERNEL: - do { + kchan = get_kernel_channel_by_name(channel_name, + cmd_ctx->session->kernel_session); + if (kchan == NULL) { + DBG("Channel not found. Creating channel %s", channel_name); + + chan = init_default_channel(cmd_ctx->lsm->domain.type, channel_name); + if (chan == NULL) { + ret = LTTCOMM_FATAL; + goto error; + } + + ret = kernel_create_channel(cmd_ctx->session->kernel_session, + chan, cmd_ctx->session->kernel_session->trace_path); + if (ret < 0) { + ret = LTTCOMM_KERN_CHAN_FAIL; + goto error; + } kchan = get_kernel_channel_by_name(channel_name, cmd_ctx->session->kernel_session); if (kchan == NULL) { - DBG("Channel not found. Creating channel %s", channel_name); - - chan = init_default_channel(channel_name); - if (chan == NULL) { - ret = LTTCOMM_FATAL; - goto error; - } - - ret = kernel_create_channel(cmd_ctx->session->kernel_session, - chan, cmd_ctx->session->kernel_session->trace_path); - if (ret < 0) { - ret = LTTCOMM_KERN_CHAN_FAIL; - goto error; - } + ERR("Channel %s not found after creation. Internal error, giving up.", + channel_name); + ret = LTTCOMM_FATAL; + goto error; } - } while (kchan == NULL); + } kevent = get_kernel_event_by_name(cmd_ctx->lsm->u.enable.event.name, kchan); if (kevent == NULL) { @@ -1784,26 +1803,32 @@ static int process_client_msg(struct command_ctx *cmd_ctx) switch (cmd_ctx->lsm->domain.type) { case LTTNG_DOMAIN_KERNEL: - do { + kchan = get_kernel_channel_by_name(channel_name, + cmd_ctx->session->kernel_session); + if (kchan == NULL) { + DBG("Channel not found. Creating channel %s", channel_name); + + chan = init_default_channel(cmd_ctx->lsm->domain.type, channel_name); + if (chan == NULL) { + ret = LTTCOMM_FATAL; + goto error; + } + + ret = kernel_create_channel(cmd_ctx->session->kernel_session, + chan, cmd_ctx->session->kernel_session->trace_path); + if (ret < 0) { + ret = LTTCOMM_KERN_CHAN_FAIL; + goto error; + } kchan = get_kernel_channel_by_name(channel_name, cmd_ctx->session->kernel_session); if (kchan == NULL) { - DBG("Channel not found. Creating channel %s", channel_name); - - chan = init_default_channel(channel_name); - if (chan == NULL) { - ret = LTTCOMM_FATAL; - goto error; - } - - ret = kernel_create_channel(cmd_ctx->session->kernel_session, - chan, cmd_ctx->session->kernel_session->trace_path); - if (ret < 0) { - ret = LTTCOMM_KERN_CHAN_FAIL; - goto error; - } + ERR("Channel %s not found after creation. Internal error, giving up.", + channel_name); + ret = LTTCOMM_FATAL; + goto error; } - } while (kchan == NULL); + } /* For each event in the kernel session */ cds_list_for_each_entry(kevent, &kchan->events_list.head, list) { @@ -1936,16 +1961,16 @@ static int process_client_msg(struct command_ctx *cmd_ctx) } } - DBG("Start kernel tracing"); - ret = kernel_start_session(cmd_ctx->session->kernel_session); + ret = start_kernel_trace(cmd_ctx->session->kernel_session); if (ret < 0) { - ERR("Kernel start session failed"); ret = LTTCOMM_KERN_START_FAIL; goto error; } - ret = start_kernel_trace(cmd_ctx->session->kernel_session); + DBG("Start kernel tracing"); + ret = kernel_start_session(cmd_ctx->session->kernel_session); if (ret < 0) { + ERR("Kernel start session failed"); ret = LTTCOMM_KERN_START_FAIL; goto error; }