X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fmodprobe.c;h=6f9a9978a75496f2510b9302b0b058008d3cc206;hb=35e090b7b37c53e911e61007d0d08e424ab39470;hp=5fed97bf992061ee4efd78c148c41ce83fc4646d;hpb=e6421494d290d39f27e4fd596a574306b9faa514;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/modprobe.c b/src/bin/lttng-sessiond/modprobe.c index 5fed97bf9..6f9a9978a 100644 --- a/src/bin/lttng-sessiond/modprobe.c +++ b/src/bin/lttng-sessiond/modprobe.c @@ -16,7 +16,6 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#define _GNU_SOURCE #define _LGPL_SOURCE #include #include @@ -34,8 +33,6 @@ /* LTTng kernel tracer mandatory core modules list */ struct kern_modules_param kern_modules_control_core[] = { - { "lttng-tracer" }, /* MUST be loaded first so keep at top */ - { "lttng-lib-ring-buffer" }, { "lttng-ring-buffer-client-discard" }, { "lttng-ring-buffer-client-overwrite" }, { "lttng-ring-buffer-metadata-client" }, @@ -44,14 +41,6 @@ struct kern_modules_param kern_modules_control_core[] = { { "lttng-ring-buffer-metadata-mmap-client" }, }; -/* LTTng kernel tracer optional base modules list */ -struct kern_modules_param kern_modules_control_opt[] = { - { "lttng-types" }, - { "lttng-ftrace" }, - { "lttng-kprobes" }, - { "lttng-kretprobes" }, -}; - /* LTTng kernel tracer probe modules list */ struct kern_modules_param kern_modules_probes_default[] = { { "lttng-probe-asoc" }, @@ -92,6 +81,8 @@ struct kern_modules_param kern_modules_probes_default[] = { { "lttng-probe-v4l2" }, { "lttng-probe-workqueue" }, { "lttng-probe-writeback" }, + { "lttng-probe-x86-irq-vectors" }, + { "lttng-probe-x86-exceptions" }, }; /* dynamic probe modules list */ @@ -99,76 +90,6 @@ static struct kern_modules_param *probes; static int nr_probes; static int probes_capacity; -static void modprobe_remove_lttng(const struct kern_modules_param *modules, - int entries, int required) -{ - int ret = 0, i; - char modprobe[256]; - - for (i = entries - 1; i >= 0; i--) { - ret = snprintf(modprobe, sizeof(modprobe), - "/sbin/modprobe -r -q %s", - modules[i].name); - if (ret < 0) { - PERROR("snprintf modprobe -r"); - return; - } - modprobe[sizeof(modprobe) - 1] = '\0'; - ret = system(modprobe); - if (ret == -1) { - ERR("Unable to launch modprobe -r for module %s", - modules[i].name); - } else if (required && WEXITSTATUS(ret) != 0) { - ERR("Unable to remove module %s", - modules[i].name); - } else { - DBG("Modprobe removal successful %s", - modules[i].name); - } - } -} - -/* - * Remove control kernel module(s) in reverse load order. - */ -void modprobe_remove_lttng_control(void) -{ - modprobe_remove_lttng(kern_modules_control_opt, - ARRAY_SIZE(kern_modules_control_opt), - LTTNG_MOD_OPTIONAL); - modprobe_remove_lttng(kern_modules_control_core, - ARRAY_SIZE(kern_modules_control_core), - LTTNG_MOD_REQUIRED); -} - -/* - * Remove data kernel modules in reverse load order. - */ -void modprobe_remove_lttng_data(void) -{ - int i; - - if (probes) { - modprobe_remove_lttng(probes, nr_probes, LTTNG_MOD_OPTIONAL); - - for (i = 0; i < nr_probes; ++i) { - free(probes[i].name); - } - - free(probes); - probes = NULL; - } -} - -/* - * Remove all kernel modules in reverse order. - */ -void modprobe_remove_lttng_all(void) -{ - modprobe_remove_lttng_data(); - modprobe_remove_lttng_control(); -} - #if HAVE_KMOD #include static void log_kmod(void *data, int priority, const char *file, int line, @@ -284,6 +205,81 @@ error: #endif /* HAVE_KMOD */ +static void modprobe_remove_lttng(const struct kern_modules_param *modules, + int entries, int required) +{ + int ret = 0, i; + char modprobe[256]; + + for (i = entries - 1; i >= 0; i--) { + ret = snprintf(modprobe, sizeof(modprobe), + "/sbin/modprobe -r -q %s", + modules[i].name); + if (ret < 0) { + PERROR("snprintf modprobe -r"); + return; + } + modprobe[sizeof(modprobe) - 1] = '\0'; + ret = system(modprobe); + if (ret == -1) { + ERR("Unable to launch modprobe -r for module %s", + modules[i].name); + } else if (required && WEXITSTATUS(ret) != 0) { + ERR("Unable to remove module %s", + modules[i].name); + } else { + DBG("Modprobe removal successful %s", + modules[i].name); + } + } +} + +/* + * Remove control kernel module(s) in reverse load order. + */ +void modprobe_remove_lttng_control(void) +{ + modprobe_remove_lttng(kern_modules_control_core, + ARRAY_SIZE(kern_modules_control_core), + LTTNG_MOD_REQUIRED); +} + +static void free_probes(void) +{ + int i; + + if (!probes) { + return; + } + for (i = 0; i < nr_probes; ++i) { + free(probes[i].name); + } + free(probes); + probes = NULL; + nr_probes = 0; +} + +/* + * Remove data kernel modules in reverse load order. + */ +void modprobe_remove_lttng_data(void) +{ + if (!probes) { + return; + } + modprobe_remove_lttng(probes, nr_probes, LTTNG_MOD_OPTIONAL); + free_probes(); +} + +/* + * Remove all kernel modules in reverse order. + */ +void modprobe_remove_lttng_all(void) +{ + modprobe_remove_lttng_data(); + modprobe_remove_lttng_control(); +} + /* * Load control kernel module(s). */ @@ -294,11 +290,6 @@ int modprobe_lttng_control(void) ret = modprobe_lttng(kern_modules_control_core, ARRAY_SIZE(kern_modules_control_core), LTTNG_MOD_REQUIRED); - if (ret != 0) - return ret; - ret = modprobe_lttng(kern_modules_control_opt, - ARRAY_SIZE(kern_modules_control_opt), - LTTNG_MOD_OPTIONAL); return ret; } @@ -351,11 +342,12 @@ static int grow_probes(void) static int append_list_to_probes(const char *list) { char *next; - int index = nr_probes, ret; + int ret; + char *tmp_list, *cur_list; assert(list); - char *tmp_list = strdup(list); + cur_list = tmp_list = strdup(list); if (!tmp_list) { PERROR("strdup temp list"); return -ENOMEM; @@ -365,11 +357,11 @@ static int append_list_to_probes(const char *list) size_t name_len; struct kern_modules_param *cur_mod; - next = strtok(tmp_list, ","); + next = strtok(cur_list, ","); if (!next) { break; } - tmp_list = NULL; + cur_list = NULL; /* filter leading spaces */ while (*next == ' ') { @@ -379,33 +371,38 @@ static int append_list_to_probes(const char *list) if (probes_capacity <= nr_probes) { ret = grow_probes(); if (ret) { - return ret; + goto error; } } /* Length 13 is "lttng-probe-" + \0 */ name_len = strlen(next) + 13; - cur_mod = &probes[index]; + cur_mod = &probes[nr_probes]; cur_mod->name = zmalloc(name_len); if (!cur_mod->name) { PERROR("malloc probe list"); - return -ENOMEM; + ret = -ENOMEM; + goto error; } ret = snprintf(cur_mod->name, name_len, "lttng-probe-%s", next); if (ret < 0) { PERROR("snprintf modprobe name"); - return -ENOMEM; + ret = -ENOMEM; + goto error; } - cur_mod++; nr_probes++; } free(tmp_list); - return 0; + +error: + free(tmp_list); + free_probes(); + return ret; } /* @@ -429,15 +426,14 @@ int modprobe_lttng_data(void) if (list) { /* User-specified probes. */ ret = append_list_to_probes(list); - if (ret) { return ret; } } else { /* Default probes. */ int def_len = ARRAY_SIZE(kern_modules_probes_default); - probes = zmalloc(sizeof(*probes) * def_len); + probes = zmalloc(sizeof(*probes) * def_len); if (!probes) { PERROR("malloc probe list"); return -ENOMEM; @@ -450,7 +446,8 @@ int modprobe_lttng_data(void) if (!name) { PERROR("strdup probe item"); - return -ENOMEM; + ret = -ENOMEM; + goto error; } probes[i].name = name; @@ -469,12 +466,20 @@ int modprobe_lttng_data(void) if (list) { ret = append_list_to_probes(list); if (ret) { - return ret; + goto error; } } /* * Load probes modules now. */ - return modprobe_lttng(probes, nr_probes, LTTNG_MOD_OPTIONAL); + ret = modprobe_lttng(probes, nr_probes, LTTNG_MOD_OPTIONAL); + if (ret) { + goto error; + } + return ret; + +error: + free_probes(); + return ret; }