X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=ltt-sessiond%2Fmain.c;h=9b76a56adce2486efca5aecd66f29b2aca1343e3;hb=aaf267147df386f0438de88782296077ff5b5861;hp=76e927e43a3fa68b938e79a1d3b28549886d0c20;hpb=894be886aae0f1a1f49e63723511fcb15e816e7e;p=lttng-tools.git diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 76e927e43..9b76a56ad 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -40,6 +40,7 @@ #include "liblttsessiondcomm.h" #include "ltt-sessiond.h" #include "lttngerr.h" +#include "kernel-ctl.h" #include "session.h" #include "trace.h" #include "traceable-app.h" @@ -95,6 +96,7 @@ static char kconsumerd_cmd_unix_sock_path[PATH_MAX]; /* kconsumerd command Unix static int client_sock; static int apps_sock; static int kconsumerd_err_sock; +static int kernel_tracer_fd; /* * thread_manage_kconsumerd @@ -455,6 +457,24 @@ static int process_client_msg(struct command_ctx *cmd_ctx) break; } + /* Check command for kernel tracing */ + switch (cmd_ctx->lsm->cmd_type) { + case KERNEL_CREATE_SESSION: + case KERNEL_CREATE_CHANNEL: + case KERNEL_DISABLE_EVENT: + case KERNEL_ENABLE_EVENT: + case KERNEL_OPEN_METADATA: + case KERNEL_START_TRACE: + case KERNEL_STOP_TRACE: + /* TODO: reconnect to kernel tracer to check if + * it's loadded */ + if (kernel_tracer_fd == 0) { + ret = LTTCOMM_KERN_NA; + goto error; + } + break; + } + /* Connect to ust apps if available pid */ if (cmd_ctx->lsm->pid > 0) { /* Connect to app using ustctl API */ @@ -467,6 +487,42 @@ static int process_client_msg(struct command_ctx *cmd_ctx) /* Process by command type */ switch (cmd_ctx->lsm->cmd_type) { + case KERNEL_CREATE_SESSION: + { + ret = setup_lttng_msg(cmd_ctx, 0); + if (ret < 0) { + goto setup_error; + } + + DBG("Creating kernel session"); + + ret = kernel_create_session(cmd_ctx, kernel_tracer_fd); + if (ret < 0) { + ret = LTTCOMM_KERN_SESS_FAIL; + goto error; + } + + ret = LTTCOMM_OK; + break; + } + case KERNEL_CREATE_CHANNEL: + { + ret = setup_lttng_msg(cmd_ctx, 0); + if (ret < 0) { + goto setup_error; + } + + DBG("Creating kernel session"); + + ret = kernel_create_channel(cmd_ctx); + if (ret < 0) { + ret = LTTCOMM_KERN_CHAN_FAIL; + goto error; + } + + ret = LTTCOMM_OK; + break; + } case KERNEL_ENABLE_EVENT: { /* Setup lttng message with no payload */ @@ -477,6 +533,31 @@ static int process_client_msg(struct command_ctx *cmd_ctx) DBG("Enabling kernel event %s", cmd_ctx->lsm->u.event.event_name); + ret = kernel_enable_event(cmd_ctx->session->kernel_session->channel, cmd_ctx->lsm->u.event.event_name); + if (ret < 0) { + ret = LTTCOMM_KERN_ENABLE_FAIL; + goto error; + } + + ret = LTTCOMM_OK; + break; + } + case KERNEL_OPEN_METADATA: + { + /* Setup lttng message with no payload */ + ret = setup_lttng_msg(cmd_ctx, 0); + if (ret < 0) { + goto setup_error; + } + + DBG("Open kernel metadata"); + + ret = kernel_open_metadata(cmd_ctx->session->kernel_session); + if (ret < 0) { + ret = LTTCOMM_KERN_META_FAIL; + goto error; + } + ret = LTTCOMM_OK; break; } @@ -909,6 +990,21 @@ error: return ret; } +/* + * init_kernel_tracer + * + * Setup necessary data for kernel tracer action. + */ +static void init_kernel_tracer(void) +{ + /* Set the global kernel tracer fd */ + kernel_tracer_fd = open(DEFAULT_KERNEL_TRACER_PATH, O_RDWR); + if (kernel_tracer_fd < 0) { + WARN("No kernel tracer available"); + kernel_tracer_fd = 0; + } +} + /* * set_kconsumerd_sockets * @@ -1050,6 +1146,9 @@ static void cleanup() if (ret < 0) { ERR("Unable to clean " LTTNG_RUNDIR); } + + // TODO Clean kernel trace fds + close(kernel_tracer_fd); } /* @@ -1101,6 +1200,9 @@ int main(int argc, char **argv) if (ret < 0) { goto error; } + + /* Setup kernel tracer */ + init_kernel_tracer(); } else { if (strlen(apps_unix_sock_path) == 0) { snprintf(apps_unix_sock_path, PATH_MAX,