X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt-sessiond%2Fmain.c;h=825fa4371cb67b0316fcf9ce8b6e677dd1f0f115;hb=558e70e9829c97ecd228516f6e312768be0536d7;hp=97569f6d1179a4dd13a6470eff04e4380fea8dc4;hpb=54d01ffb43587b221dc50ec42b6070fad89bd255;p=lttng-tools.git diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 97569f6d1..825fa4371 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -1455,7 +1455,7 @@ static void init_kernel_tracer(void) int ret; char *proc_mounts = "/proc/mounts"; char line[256]; - char *debugfs_path = NULL, *lttng_path; + char *debugfs_path = NULL, *lttng_path = NULL; FILE *fp; /* Detect debugfs */ @@ -1561,15 +1561,30 @@ error: /* * Create an UST session and add it to the session ust list. */ -static int create_ust_session(pid_t pid, struct ltt_session *session) +static int create_ust_session(struct ltt_session *session, + struct lttng_domain *domain) { - int ret = -1; + int ret; struct ltt_ust_session *lus; + struct ltt_traceable_app *app; + + switch (domain->type) { + case LTTNG_DOMAIN_UST_PID: + app = traceable_app_get_by_pid(domain->attr.pid); + if (app == NULL) { + ret = LTTCOMM_APP_NOT_FOUND; + goto error; + } + break; + default: + goto error; + } DBG("Creating UST session"); - lus = trace_ust_create_session(session->path, pid); + lus = trace_ust_create_session(session->path, domain->attr.pid, domain); if (lus == NULL) { + ret = LTTCOMM_UST_SESS_FAIL; goto error; } @@ -1578,17 +1593,22 @@ static int create_ust_session(pid_t pid, struct ltt_session *session) if (ret < 0) { if (ret != -EEXIST) { ERR("Trace directory creation error"); + ret = LTTCOMM_UST_SESS_FAIL; goto error; } } /* Create session on the UST tracer */ - ret = ustctl_create_session(lus); + ret = ustctl_create_session(app->sock, lus); if (ret < 0) { + ret = LTTCOMM_UST_SESS_FAIL; goto error; } - return 0; + cds_list_add(&lus->list, &session->ust_session_list.head); + session->ust_session_list.count++; + + return LTTCOMM_OK; error: free(lus); @@ -1713,6 +1733,12 @@ static void list_lttng_events(struct ltt_kernel_channel *kchan, memcpy(&events[i].attr.ftrace, &event->event->u.ftrace, sizeof(struct lttng_kernel_function)); break; + case LTTNG_KERNEL_NOOP: + events[i].type = LTTNG_EVENT_NOOP; + break; + case LTTNG_KERNEL_SYSCALL: + events[i].type = LTTNG_EVENT_SYSCALL; + break; } i++; } @@ -1736,9 +1762,10 @@ static int cmd_disable_channel(struct ltt_session *session, kernel_wait_quiescent(kernel_tracer_fd); break; + case LTTNG_DOMAIN_UST_PID: + break; default: - /* TODO: Userspace tracing */ - ret = LTTCOMM_NOT_IMPLEMENTED; + ret = LTTCOMM_UNKNOWN_DOMAIN; goto error; } @@ -1751,33 +1778,106 @@ error: /* * Command LTTNG_ENABLE_CHANNEL processed by the client thread. */ -static int cmd_enable_channel(struct ltt_session *session, int domain, - char *channel_name, struct lttng_channel *attr) +static int cmd_enable_channel(struct ltt_session *session, + struct lttng_domain *domain, struct lttng_channel *attr) { int ret; - struct ltt_kernel_channel *kchan; - switch (domain) { - case LTTNG_DOMAIN_KERNEL: - kchan = trace_kernel_get_channel_by_name(channel_name, - session->kernel_session); - if (kchan == NULL) { - ret = channel_kernel_create(session->kernel_session, - channel_name, attr, kernel_poll_pipe[1]); - } else { - ret = channel_kernel_enable(session->kernel_session, kchan); - } + switch (domain->type) { + case LTTNG_DOMAIN_KERNEL: + { + struct ltt_kernel_channel *kchan; - if (ret != LTTCOMM_OK) { + kchan = trace_kernel_get_channel_by_name(attr->name, + session->kernel_session); + if (kchan == NULL) { + ret = channel_kernel_create(session->kernel_session, + attr, kernel_poll_pipe[1]); + } else { + ret = channel_kernel_enable(session->kernel_session, kchan); + } + + if (ret != LTTCOMM_OK) { + goto error; + } + + kernel_wait_quiescent(kernel_tracer_fd); + break; + } + case LTTNG_DOMAIN_UST_PID: + { + struct ltt_ust_event *uevent, *new_uevent; + struct ltt_ust_session *usess; + struct ltt_ust_channel *uchan, *app_chan; + struct ltt_traceable_app *app; + + usess = trace_ust_get_session_by_pid(&session->ust_session_list, + domain->attr.pid); + if (usess == NULL) { + ret = LTTCOMM_UST_CHAN_NOT_FOUND; + goto error; + } + + app = traceable_app_get_by_pid(domain->attr.pid); + if (app == NULL) { + ret = LTTCOMM_APP_NOT_FOUND; + goto error; + } + + uchan = trace_ust_get_channel_by_name(attr->name, usess); + if (uchan == NULL) { + ret = channel_ust_create(usess, attr, app->sock); + } else { + ret = channel_ust_enable(usess, uchan, app->sock); + } + + if (ret != LTTCOMM_OK) { + goto error; + } + + /*TODO: This should be put in an external function */ + + /* Copy UST channel to add to the traceable app */ + uchan = trace_ust_get_channel_by_name(attr->name, usess); + if (uchan == NULL) { + ret = LTTCOMM_FATAL; + goto error; + } + + app_chan = trace_ust_create_channel(attr, session->path); + if (app_chan == NULL) { + PERROR("malloc ltt_ust_channel"); + ret = LTTCOMM_FATAL; + goto error; + } + + memcpy(app_chan, uchan, sizeof(struct ltt_ust_channel)); + CDS_INIT_LIST_HEAD(&app_chan->events.head); + + cds_list_for_each_entry(uevent, &uchan->events.head, list) { + new_uevent = malloc(sizeof(struct ltt_ust_event)); + if (new_uevent == NULL) { + PERROR("malloc ltt_ust_event"); + ret = LTTCOMM_FATAL; goto error; } - kernel_wait_quiescent(kernel_tracer_fd); - break; - default: - /* TODO: Userspace tracing */ - ret = LTTCOMM_NOT_IMPLEMENTED; - goto error; + memcpy(new_uevent, uevent, sizeof(struct ltt_ust_event)); + cds_list_add(&new_uevent->list, &app_chan->events.head); + app_chan->events.count++; + } + + /* Add channel to traceable_app */ + cds_list_add(&app_chan->list, &app->channels.head); + app->channels.count++; + + DBG("UST channel %s created for app sock %d with pid %d", + attr->name, app->sock, domain->attr.pid); + break; + } + default: + ret = LTTCOMM_UNKNOWN_DOMAIN; + goto error; } ret = LTTCOMM_OK; @@ -1905,7 +2005,7 @@ static int cmd_enable_event(struct ltt_session *session, int domain, session->kernel_session); if (kchan == NULL) { /* This call will notify the kernel thread */ - ret = channel_kernel_create(session->kernel_session, channel_name, + ret = channel_kernel_create(session->kernel_session, NULL, kernel_poll_pipe[1]); if (ret != LTTCOMM_OK) { goto error; @@ -1944,7 +2044,7 @@ error: * Command LTTNG_ENABLE_ALL_EVENT processed by the client thread. */ static int cmd_enable_event_all(struct ltt_session *session, int domain, - char *channel_name) + char *channel_name, int event_type) { int ret; struct ltt_kernel_channel *kchan; @@ -1955,8 +2055,8 @@ static int cmd_enable_event_all(struct ltt_session *session, int domain, session->kernel_session); if (kchan == NULL) { /* This call will notify the kernel thread */ - ret = channel_kernel_create(session->kernel_session, channel_name, - NULL, kernel_poll_pipe[1]); + ret = channel_kernel_create(session->kernel_session, NULL, + kernel_poll_pipe[1]); if (ret != LTTCOMM_OK) { goto error; } @@ -1971,8 +2071,18 @@ static int cmd_enable_event_all(struct ltt_session *session, int domain, goto error; } - ret = event_kernel_enable_all(session->kernel_session, - kchan, kernel_tracer_fd); + if (event_type == LTTNG_KERNEL_SYSCALL) { + ret = event_kernel_enable_syscalls(session->kernel_session, + kchan, kernel_tracer_fd); + } else { + /* + * This call enables all LTTNG_KERNEL_TRACEPOINTS and events + * already registered to the channel. + */ + ret = event_kernel_enable_all(session->kernel_session, + kchan, kernel_tracer_fd); + } + if (ret != LTTCOMM_OK) { goto error; } @@ -2352,13 +2462,13 @@ error: static int process_client_msg(struct command_ctx *cmd_ctx) { int ret = LTTCOMM_OK; - int need_kernel_session = 1; + int need_tracing_session = 1; DBG("Processing client command %d", cmd_ctx->lsm->cmd_type); /* * Check for command that don't needs to allocate a returned payload. We do - * this here so we don't have to make the call for no payload" at each + * this here so we don't have to make the call for no payload at each * command. */ switch(cmd_ctx->lsm->cmd_type) { @@ -2383,7 +2493,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx) case LTTNG_CREATE_SESSION: case LTTNG_LIST_SESSIONS: case LTTNG_LIST_TRACEPOINTS: - need_kernel_session = 0; + need_tracing_session = 0; break; default: DBG("Getting session %s by name", cmd_ctx->lsm->session.name); @@ -2419,7 +2529,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx) } /* Need a session for kernel command */ - if (need_kernel_session) { + if (need_tracing_session) { if (cmd_ctx->session->kernel_session == NULL) { ret = create_kernel_session(cmd_ctx->session); if (ret < 0) { @@ -2439,6 +2549,24 @@ static int process_client_msg(struct command_ctx *cmd_ctx) } } break; + case LTTNG_DOMAIN_UST_PID: + { + struct ltt_ust_session *usess; + + if (need_tracing_session) { + usess = trace_ust_get_session_by_pid( + &cmd_ctx->session->ust_session_list, + cmd_ctx->lsm->domain.attr.pid); + if (usess == NULL) { + ret = create_ust_session(cmd_ctx->session, + &cmd_ctx->lsm->domain); + if (ret != LTTCOMM_OK) { + goto error; + } + } + } + break; + } default: /* TODO Userspace tracer */ break; @@ -2478,8 +2606,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx) } case LTTNG_ENABLE_CHANNEL: { - ret = cmd_enable_channel(cmd_ctx->session, cmd_ctx->lsm->domain.type, - cmd_ctx->lsm->u.enable.channel_name, + ret = cmd_enable_channel(cmd_ctx->session, &cmd_ctx->lsm->domain, &cmd_ctx->lsm->u.channel.chan); break; } @@ -2495,7 +2622,8 @@ static int process_client_msg(struct command_ctx *cmd_ctx) DBG("Enabling all kernel event"); ret = cmd_enable_event_all(cmd_ctx->session, cmd_ctx->lsm->domain.type, - cmd_ctx->lsm->u.enable.channel_name); + cmd_ctx->lsm->u.enable.channel_name, + cmd_ctx->lsm->u.enable.event.type); break; } case LTTNG_LIST_TRACEPOINTS: @@ -2603,7 +2731,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx) case LTTNG_LIST_EVENTS: { size_t nb_event; - struct lttng_event *events; + struct lttng_event *events = NULL; nb_event = cmd_list_events(cmd_ctx->session, cmd_ctx->lsm->u.list.channel_name, &events); @@ -2817,7 +2945,7 @@ static void *thread_manage_clients(void *data) DBG("Sending response (size: %d, retcode: %s)", cmd_ctx->lttng_msg_size, - lttng_get_readable_code(cmd_ctx->llm->ret_code)); + lttng_get_readable_code(-cmd_ctx->llm->ret_code)); ret = send_unix_sock(sock, cmd_ctx->llm, cmd_ctx->lttng_msg_size); if (ret < 0) { ERR("Failed to send data back to client");