X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt-sessiond%2Fmain.c;h=5636700d8fad1cd3127c9c6571b03a648782261d;hb=17edf6cea62f0ed842a5a9e831c7cc868fa43600;hp=cb8b98c7b7141ec4b9492738ee3d87abf846d4b5;hpb=0d0c377ae0d483b1070409811ff5409ab05aa72b;p=lttng-tools.git diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index cb8b98c7b..5636700d8 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -99,6 +99,8 @@ static sem_t kconsumerd_sem; static pthread_mutex_t kconsumerd_pid_mutex; /* Mutex to control kconsumerd pid assignation */ +static int modprobe_remove_kernel_modules(void); + /* * Pointer initialized before thread creation. * @@ -195,6 +197,9 @@ static void cleanup() DBG("Closing kernel fd"); close(kernel_tracer_fd); + + DBG("Unloading kernel modules"); + modprobe_remove_kernel_modules(); } /* @@ -944,22 +949,67 @@ error: */ static int modprobe_kernel_modules(void) { - int ret = 0, i = 0; + int ret = 0, i; char modprobe[256]; - while (kernel_modules_list[i] != NULL) { - ret = snprintf(modprobe, sizeof(modprobe), "/sbin/modprobe %s", - kernel_modules_list[i]); + for (i = 0; i < ARRAY_SIZE(kernel_modules_list); i++) { + ret = snprintf(modprobe, sizeof(modprobe), + "/sbin/modprobe %s%s", + kernel_modules_list[i].required ? "" : "--quiet ", + kernel_modules_list[i].name); if (ret < 0) { perror("snprintf modprobe"); goto error; } + modprobe[sizeof(modprobe) - 1] = '\0'; ret = system(modprobe); + if (ret == -1) { + ERR("Unable to launch modprobe for module %s", + kernel_modules_list[i].name); + } else if (kernel_modules_list[i].required + && WEXITSTATUS(ret) != 0) { + ERR("Unable to load module %s", + kernel_modules_list[i].name); + } else { + DBG("Modprobe successfully %s", + kernel_modules_list[i].name); + } + } + +error: + return ret; +} + +/* + * modprobe_remove_kernel_modules + * Remove modules in reverse load order. + */ +static int modprobe_remove_kernel_modules(void) +{ + int ret = 0, i; + char modprobe[256]; + + for (i = ARRAY_SIZE(kernel_modules_list) - 1; i >= 0; i--) { + ret = snprintf(modprobe, sizeof(modprobe), + "/sbin/modprobe --remove --quiet %s", + kernel_modules_list[i].name); if (ret < 0) { - ERR("Unable to load module %s", kernel_modules_list[i]); + perror("snprintf modprobe --remove"); + goto error; + } + modprobe[sizeof(modprobe) - 1] = '\0'; + ret = system(modprobe); + if (ret == -1) { + ERR("Unable to launch modprobe --remove for module %s", + kernel_modules_list[i].name); + } else if (kernel_modules_list[i].required + && WEXITSTATUS(ret) != 0) { + ERR("Unable to remove module %s", + kernel_modules_list[i].name); + } else { + DBG("Modprobe removal successful %s", + kernel_modules_list[i].name); } - DBG("Modprobe successfully %s", kernel_modules_list[i]); - i++; } error: @@ -1271,6 +1321,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx) case LTTNG_CREATE_SESSION: case LTTNG_LIST_SESSIONS: case LTTNG_LIST_TRACEPOINTS: + case LTTNG_CALIBRATE: break; default: DBG("Getting session %s by name", cmd_ctx->lsm->session.name); @@ -1291,7 +1342,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx) } /* - * Check domain type for specifif "pre-action". + * Check domain type for specific "pre-action". */ switch (cmd_ctx->lsm->domain.type) { case LTTNG_DOMAIN_KERNEL: @@ -1305,21 +1356,27 @@ static int process_client_msg(struct command_ctx *cmd_ctx) } /* Need a session for kernel command */ - if (cmd_ctx->lsm->cmd_type != LTTNG_LIST_TRACEPOINTS && - 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(); + switch (cmd_ctx->lsm->cmd_type) { + case LTTNG_CREATE_SESSION: + case LTTNG_LIST_SESSIONS: + case LTTNG_LIST_TRACEPOINTS: + case LTTNG_CALIBRATE: + break; + default: + if (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) { + goto error; + } + } } } break; @@ -1999,6 +2056,37 @@ static int process_client_msg(struct command_ctx *cmd_ctx) ret = LTTCOMM_OK; break; } + + case LTTNG_CALIBRATE: + { + /* Setup lttng message with no payload */ + ret = setup_lttng_msg(cmd_ctx, 0); + if (ret < 0) { + goto setup_error; + } + + switch (cmd_ctx->lsm->domain.type) { + case LTTNG_DOMAIN_KERNEL: + { + struct lttng_kernel_calibrate kcalibrate; + + kcalibrate.type = cmd_ctx->lsm->u.calibrate.type; + ret = kernel_calibrate(kernel_tracer_fd, &kcalibrate); + if (ret < 0) { + ret = LTTCOMM_KERN_ENABLE_FAIL; + goto error; + } + break; + } + default: + /* TODO: Userspace tracing */ + ret = LTTCOMM_NOT_IMPLEMENTED; + goto error; + } + ret = LTTCOMM_OK; + break; + } + default: /* Undefined command */ ret = setup_lttng_msg(cmd_ctx, 0);