X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fmodprobe.cpp;h=ac9f14257c6c5334a38be31e494d98fd6e619656;hb=cd9adb8b829564212158943a0d279bb35322ab30;hp=9f6c4a9c3edabb8e64b39de0c8087d54bee0d669;hpb=ce7fc42f24c2c9a62a5eeb77f248d27a5cb4de4b;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/modprobe.cpp b/src/bin/lttng-sessiond/modprobe.cpp index 9f6c4a9c3..ac9f14257 100644 --- a/src/bin/lttng-sessiond/modprobe.cpp +++ b/src/bin/lttng-sessiond/modprobe.cpp @@ -14,54 +14,63 @@ */ #define _LGPL_SOURCE +#include "kern-modules.hpp" +#include "lttng-sessiond.hpp" +#include "modprobe.hpp" + +#include +#include + #include #include #include -#include -#include - -#include "modprobe.h" -#include "kern-modules.h" -#include "lttng-sessiond.h" - /* LTTng kernel tracer mandatory core modules list */ struct kern_modules_param kern_modules_control_core[] = { { .name = (char *) "lttng-ring-buffer-client-discard", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED, + .loaded = false, }, { .name = (char *) "lttng-ring-buffer-client-overwrite", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED, + .loaded = false, }, { .name = (char *) "lttng-ring-buffer-metadata-client", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED, + .loaded = false, }, { .name = (char *) "lttng-ring-buffer-client-mmap-discard", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED, + .loaded = false, }, { .name = (char *) "lttng-ring-buffer-client-mmap-overwrite", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED, + .loaded = false, }, { .name = (char *) "lttng-ring-buffer-metadata-mmap-client", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED, + .loaded = false, }, { .name = (char *) "lttng-ring-buffer-event_notifier-client", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-counter-client-percpu-64-modular", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-counter-client-percpu-32-modular", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, }; @@ -70,170 +79,212 @@ struct kern_modules_param kern_modules_probes_default[] = { { .name = (char *) "lttng-probe-asoc", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-block", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-btrfs", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-compaction", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-ext3", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-ext4", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-gpio", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-i2c", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-irq", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-jbd", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-jbd2", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-kmem", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-kvm", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-kvm-x86", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-kvm-x86-mmu", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-lock", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-module", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-napi", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-net", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-power", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-preemptirq", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-printk", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-random", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-rcu", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-regmap", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-regulator", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-rpm", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-sched", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-scsi", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-signal", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-skb", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-sock", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-statedump", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-sunrpc", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-timer", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-udp", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-vmscan", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-v4l2", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-workqueue", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-writeback", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-x86-irq-vectors", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, { .name = (char *) "lttng-probe-x86-exceptions", .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL, + .loaded = false, }, }; @@ -248,9 +299,13 @@ static int probes_capacity; /** * @brief Logging function for libkmod integration. */ -static ATTR_FORMAT_PRINTF(6, 0) -void log_kmod(void *data, int priority, const char *file, int line, - const char *fn, const char *format, va_list args) +static ATTR_FORMAT_PRINTF(6, 0) void log_kmod(void *data __attribute__((unused)), + int priority __attribute__((unused)), + const char *file __attribute__((unused)), + int line __attribute__((unused)), + const char *fn __attribute__((unused)), + const char *format, + va_list args) { char *str; @@ -275,7 +330,7 @@ static int setup_kmod_ctx(struct kmod_ctx **ctx) { int ret = 0; - *ctx = kmod_new(NULL, NULL); + *ctx = kmod_new(nullptr, nullptr); if (!ctx) { PERROR("Unable to create kmod library context"); ret = -ENOMEM; @@ -289,7 +344,7 @@ static int setup_kmod_ctx(struct kmod_ctx **ctx) */ DIAGNOSTIC_PUSH DIAGNOSTIC_IGNORE_SUGGEST_ATTRIBUTE_FORMAT - kmod_set_log_fn(*ctx, log_kmod, NULL); + kmod_set_log_fn(*ctx, log_kmod, nullptr); DIAGNOSTIC_POP ret = kmod_load_resources(*ctx); if (ret < 0) { @@ -313,8 +368,7 @@ error: * @returns \c 0 on success * \c < 0 on error */ -static int modprobe_lttng(struct kern_modules_param *modules, - int entries) +static int modprobe_lttng(struct kern_modules_param *modules, int entries) { int ret = 0, i; struct kmod_ctx *ctx; @@ -325,7 +379,7 @@ static int modprobe_lttng(struct kern_modules_param *modules, } for (i = 0; i < entries; i++) { - struct kmod_module *mod = NULL; + struct kmod_module *mod = nullptr; ret = kmod_module_new_from_name(ctx, modules[i].name, &mod); if (ret < 0) { @@ -333,19 +387,17 @@ static int modprobe_lttng(struct kern_modules_param *modules, goto error; } - ret = kmod_module_probe_insert_module(mod, 0, - NULL, NULL, NULL, NULL); + ret = kmod_module_probe_insert_module(mod, 0, nullptr, nullptr, nullptr, nullptr); if (ret == -EEXIST) { DBG("Module %s is already loaded", modules[i].name); ret = 0; } else if (ret < 0) { if (modules[i].load_policy == KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED) { - ERR("Unable to load required module %s", - modules[i].name); + ERR("Unable to load required module %s", modules[i].name); goto error; } else { DBG("Unable to load optional module %s; continuing", - modules[i].name); + modules[i].name); ret = 0; } } else { @@ -375,7 +427,8 @@ error: * @returns \c 0 on success * \c < 0 on error */ -static int rmmod_recurse(struct kmod_module *mod) { +static int rmmod_recurse(struct kmod_module *mod) +{ int ret = 0; struct kmod_list *deps, *itr; @@ -387,12 +440,12 @@ static int rmmod_recurse(struct kmod_module *mod) { ret = kmod_module_remove_module(mod, 0); deps = kmod_module_get_dependencies(mod); - if (deps != NULL) { - kmod_list_foreach(itr, deps) { + if (deps != nullptr) { + kmod_list_foreach(itr, deps) + { struct kmod_module *dep = kmod_module_get_module(itr); if (kmod_module_get_refcnt(dep) == 0) { - DBG("Recursive remove module %s", - kmod_module_get_name(dep)); + DBG("Recursive remove module %s", kmod_module_get_name(dep)); rmmod_recurse(dep); } kmod_module_unref(dep); @@ -410,8 +463,7 @@ static int rmmod_recurse(struct kmod_module *mod) { * @param entries Number of modules in the list * */ -static void modprobe_remove_lttng(const struct kern_modules_param *modules, - int entries) +static void modprobe_remove_lttng(const struct kern_modules_param *modules, int entries) { int ret = 0, i; struct kmod_ctx *ctx; @@ -422,7 +474,7 @@ static void modprobe_remove_lttng(const struct kern_modules_param *modules, } for (i = entries - 1; i >= 0; i--) { - struct kmod_module *mod = NULL; + struct kmod_module *mod = nullptr; if (!modules[i].loaded) { continue; @@ -437,11 +489,11 @@ static void modprobe_remove_lttng(const struct kern_modules_param *modules, ret = rmmod_recurse(mod); if (ret == -EEXIST) { DBG("Module %s is not in kernel.", modules[i].name); - } else if (modules[i].load_policy == KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED && ret < 0) { + } else if (modules[i].load_policy == KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED && + ret < 0) { ERR("Unable to remove module %s", modules[i].name); } else { - DBG("Modprobe removal successful %s", - modules[i].name); + DBG("Modprobe removal successful %s", modules[i].name); } kmod_module_unref(mod); @@ -455,17 +507,20 @@ error: #else /* HAVE_KMOD */ -static int modprobe_lttng(struct kern_modules_param *modules, - int entries) +static int modprobe_lttng(struct kern_modules_param *modules, int entries) { int ret = 0, i; char modprobe[256]; for (i = 0; i < entries; i++) { - ret = snprintf(modprobe, sizeof(modprobe), - "/sbin/modprobe %s%s", - modules[i].load_policy == KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED ? "" : "-q ", - modules[i].name); + ret = snprintf(modprobe, + sizeof(modprobe), + "/sbin/modprobe %s%s", + modules[i].load_policy == + KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED ? + "" : + "-q ", + modules[i].name); if (ret < 0) { PERROR("snprintf modprobe"); goto error; @@ -475,21 +530,20 @@ static int modprobe_lttng(struct kern_modules_param *modules, if (ret == -1) { if (modules[i].load_policy == KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED) { ERR("Unable to launch modprobe for required module %s", - modules[i].name); + modules[i].name); goto error; } else { DBG("Unable to launch modprobe for optional module %s; continuing", - modules[i].name); + modules[i].name); ret = 0; } } else if (WEXITSTATUS(ret) != 0) { if (modules[i].load_policy == KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED) { - ERR("Unable to load required module %s", - modules[i].name); + ERR("Unable to load required module %s", modules[i].name); goto error; } else { DBG("Unable to load optional module %s; continuing", - modules[i].name); + modules[i].name); ret = 0; } } else { @@ -502,8 +556,7 @@ error: return ret; } -static void modprobe_remove_lttng(const struct kern_modules_param *modules, - int entries) +static void modprobe_remove_lttng(const struct kern_modules_param *modules, int entries) { int ret = 0, i; char modprobe[256]; @@ -512,9 +565,8 @@ static void modprobe_remove_lttng(const struct kern_modules_param *modules, if (!modules[i].loaded) { continue; } - ret = snprintf(modprobe, sizeof(modprobe), - "/sbin/modprobe -r -q %s", - modules[i].name); + ret = snprintf( + modprobe, sizeof(modprobe), "/sbin/modprobe -r -q %s", modules[i].name); if (ret < 0) { PERROR("snprintf modprobe -r"); return; @@ -524,18 +576,16 @@ static void modprobe_remove_lttng(const struct kern_modules_param *modules, if (ret == -1) { if (modules[i].load_policy == KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED) { ERR("Unable to launch modprobe -r for required module %s", - modules[i].name); + modules[i].name); } else { DBG("Unable to launch modprobe -r for optional module %s", - modules[i].name); + modules[i].name); } } else if (WEXITSTATUS(ret) != 0) { if (modules[i].load_policy == KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED) { - ERR("Unable to remove required module %s", - modules[i].name); + ERR("Unable to remove required module %s", modules[i].name); } else { - DBG("Unable to remove optional module %s", - modules[i].name); + DBG("Unable to remove optional module %s", modules[i].name); } } else { DBG("Modprobe removal successful %s", modules[i].name); @@ -548,13 +598,12 @@ static void modprobe_remove_lttng(const struct kern_modules_param *modules, /* * Remove control kernel module(s) in reverse load order. */ -void modprobe_remove_lttng_control(void) +void modprobe_remove_lttng_control() { - modprobe_remove_lttng(kern_modules_control_core, - ARRAY_SIZE(kern_modules_control_core)); + modprobe_remove_lttng(kern_modules_control_core, ARRAY_SIZE(kern_modules_control_core)); } -static void free_probes(void) +static void free_probes() { int i; @@ -565,14 +614,14 @@ static void free_probes(void) free(probes[i].name); } free(probes); - probes = NULL; + probes = nullptr; nr_probes = 0; } /* * Remove data kernel modules in reverse load order. */ -void modprobe_remove_lttng_data(void) +void modprobe_remove_lttng_data() { if (!probes) { return; @@ -585,7 +634,7 @@ void modprobe_remove_lttng_data(void) /* * Remove all kernel modules in reverse order. */ -void modprobe_remove_lttng_all(void) +void modprobe_remove_lttng_all() { modprobe_remove_lttng_data(); modprobe_remove_lttng_control(); @@ -594,24 +643,23 @@ void modprobe_remove_lttng_all(void) /* * Load control kernel module(s). */ -int modprobe_lttng_control(void) +int modprobe_lttng_control() { - return modprobe_lttng(kern_modules_control_core, - ARRAY_SIZE(kern_modules_control_core)); + return modprobe_lttng(kern_modules_control_core, ARRAY_SIZE(kern_modules_control_core)); } /** * Grow global list of probes (double capacity or set it to 1 if * currently 0 and copy existing data). */ -static int grow_probes(void) +static int grow_probes() { int i; struct kern_modules_param *tmp_probes; /* Initialize capacity to 1 if 0. */ if (probes_capacity == 0) { - probes = (kern_modules_param *) zmalloc(sizeof(*probes)); + probes = zmalloc(); if (!probes) { PERROR("malloc probe list"); return -ENOMEM; @@ -624,7 +672,7 @@ static int grow_probes(void) /* Double size. */ probes_capacity *= 2; - tmp_probes = (kern_modules_param *) zmalloc(sizeof(*tmp_probes) * probes_capacity); + tmp_probes = calloc(probes_capacity); if (!tmp_probes) { PERROR("malloc probe list"); return -ENOMEM; @@ -668,7 +716,7 @@ static int append_list_to_probes(const char *list) if (!next) { break; } - cur_list = NULL; + cur_list = nullptr; /* filter leading spaces */ while (*next == ' ') { @@ -686,7 +734,7 @@ static int append_list_to_probes(const char *list) name_len = strlen(next) + 13; cur_mod = &probes[nr_probes]; - cur_mod->name = (char *) zmalloc(name_len); + cur_mod->name = calloc(name_len); if (!cur_mod->name) { PERROR("malloc probe list"); ret = -ENOMEM; @@ -717,7 +765,7 @@ error: /* * Load data kernel module(s). */ -int modprobe_lttng_data(void) +int modprobe_lttng_data() { int ret, i; char *list; @@ -737,7 +785,7 @@ int modprobe_lttng_data(void) /* Default probes. */ int def_len = ARRAY_SIZE(kern_modules_probes_default); - probes = (kern_modules_param *) zmalloc(sizeof(*probes) * def_len); + probes = calloc(def_len); if (!probes) { PERROR("malloc probe list"); return -ENOMEM; @@ -746,7 +794,7 @@ int modprobe_lttng_data(void) nr_probes = probes_capacity = def_len; for (i = 0; i < def_len; ++i) { - char* name = strdup(kern_modules_probes_default[i].name); + char *name = strdup(kern_modules_probes_default[i].name); if (!name) { PERROR("strdup probe item");