X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fmodprobe.c;h=2fbc7bd8734bde95e51831b401769b0bd3d41829;hb=ab57d7d35916e90d36429ed717d58610c9005d14;hp=8e5cc949ea7e067c14937f27ded70d06e8b0e7b5;hpb=e3e57ea7c5b6379b0a2df41acbcacb731a6acdd9;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/modprobe.c b/src/bin/lttng-sessiond/modprobe.c index 8e5cc949e..2fbc7bd87 100644 --- a/src/bin/lttng-sessiond/modprobe.c +++ b/src/bin/lttng-sessiond/modprobe.c @@ -25,84 +25,111 @@ #include "modprobe.h" #include "kern-modules.h" -/* MUST be loaded first */ -const struct kern_modules_param kern_modules_control[] = { - { "lttng-tracer", 1 }, +#define LTTNG_MOD_REQUIRED 1 +#define LTTNG_MOD_OPTIONAL 0 + +/* 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" }, + { "lttng-ring-buffer-client-mmap-discard" }, + { "lttng-ring-buffer-client-mmap-overwrite" }, + { "lttng-ring-buffer-metadata-mmap-client" }, }; -/* LTTng kernel tracer modules list */ -const struct kern_modules_param kern_modules_list[] = { - { "lttng-ftrace", 0 }, - { "lttng-kprobes", 0 }, - { "lttng-kretprobes", 0 }, - { "lttng-lib-ring-buffer", 1 }, - { "lttng-ring-buffer-client-discard", 1 }, - { "lttng-ring-buffer-client-overwrite", 1 }, - { "lttng-ring-buffer-metadata-client", 1 }, - { "lttng-ring-buffer-client-mmap-discard", 1 }, - { "lttng-ring-buffer-client-mmap-overwrite", 1 }, - { "lttng-ring-buffer-metadata-mmap-client", 1 }, - { "lttng-probe-lttng", 1 }, - { "lttng-types", 0 }, - { "lttng-probe-asoc", 0 }, - { "lttng-probe-block", 0 }, - { "lttng-probe-ext3", 0 }, - { "lttng-probe-gpio", 0 }, - { "lttng-probe-irq", 0 }, - { "lttng-probe-jbd", 0 }, - { "lttng-probe-jbd2", 0 }, - { "lttng-probe-kmem", 0 }, - { "lttng-probe-kvm", 0 }, - { "lttng-probe-lock", 0 }, - { "lttng-probe-module", 0 }, - { "lttng-probe-napi", 0 }, - { "lttng-probe-net", 0 }, - { "lttng-probe-power", 0 }, - { "lttng-probe-regulator", 0 }, - { "lttng-probe-sched", 0 }, - { "lttng-probe-scsi", 0 }, - { "lttng-probe-signal", 0 }, - { "lttng-probe-skb", 0 }, - { "lttng-probe-sock", 0 }, - { "lttng-probe-statedump", 0 }, - { "lttng-probe-timer", 0 }, - { "lttng-probe-udp", 0 }, - { "lttng-probe-vmscan", 0 }, +/* LTTng kernel tracer optional base modules list */ +struct kern_modules_param kern_modules_control_opt[] = { + { "lttng-types" }, + { "lttng-ftrace" }, + { "lttng-kprobes" }, + { "lttng-kretprobes" }, }; -/* - * Remove control kernel module(s) in reverse load order. - */ -void modprobe_remove_lttng_control(void) +/* LTTng kernel tracer probe modules list */ +const struct kern_modules_param kern_modules_probes[] = { + { "lttng-probe-asoc" }, + { "lttng-probe-block" }, + { "lttng-probe-btrfs" }, + { "lttng-probe-compaction" }, + { "lttng-probe-ext3" }, + { "lttng-probe-ext4" }, + { "lttng-probe-gpio" }, + { "lttng-probe-irq" }, + { "lttng-probe-jbd" }, + { "lttng-probe-jbd2" }, + { "lttng-probe-kmem" }, + { "lttng-probe-kvm" }, + { "lttng-probe-kvm-x86" }, + { "lttng-probe-kvm-x86-mmu" }, + { "lttng-probe-lock" }, + { "lttng-probe-module" }, + { "lttng-probe-napi" }, + { "lttng-probe-net" }, + { "lttng-probe-power" }, + { "lttng-probe-printk" }, + { "lttng-probe-random" }, + { "lttng-probe-rcu" }, + { "lttng-probe-regmap" }, + { "lttng-probe-regulator" }, + { "lttng-probe-rpm" }, + { "lttng-probe-sched" }, + { "lttng-probe-scsi" }, + { "lttng-probe-signal" }, + { "lttng-probe-skb" }, + { "lttng-probe-sock" }, + { "lttng-probe-statedump" }, + { "lttng-probe-sunrpc" }, + { "lttng-probe-timer" }, + { "lttng-probe-udp" }, + { "lttng-probe-vmscan" }, + { "lttng-probe-v4l2" }, + { "lttng-probe-workqueue" }, + { "lttng-probe-writeback" }, +}; + +void modprobe_remove_lttng(const struct kern_modules_param *modules, + int entries, int required) { int ret = 0, i; char modprobe[256]; - for (i = ARRAY_SIZE(kern_modules_control) - 1; i >= 0; i--) { + for (i = entries - 1; i >= 0; i--) { ret = snprintf(modprobe, sizeof(modprobe), "/sbin/modprobe -r -q %s", - kern_modules_control[i].name); + modules[i].name); if (ret < 0) { PERROR("snprintf modprobe -r"); - goto error; + return; } modprobe[sizeof(modprobe) - 1] = '\0'; ret = system(modprobe); if (ret == -1) { ERR("Unable to launch modprobe -r for module %s", - kern_modules_control[i].name); - } else if (kern_modules_control[i].required - && WEXITSTATUS(ret) != 0) { + modules[i].name); + } else if (required && WEXITSTATUS(ret) != 0) { ERR("Unable to remove module %s", - kern_modules_control[i].name); + modules[i].name); } else { DBG("Modprobe removal successful %s", - kern_modules_control[i].name); + modules[i].name); } } +} -error: - return; +/* + * 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); } /* @@ -110,34 +137,9 @@ error: */ void modprobe_remove_lttng_data(void) { - int ret = 0, i; - char modprobe[256]; - - for (i = ARRAY_SIZE(kern_modules_list) - 1; i >= 0; i--) { - ret = snprintf(modprobe, sizeof(modprobe), - "/sbin/modprobe -r -q %s", - kern_modules_list[i].name); - if (ret < 0) { - PERROR("snprintf modprobe -r"); - goto error; - } - modprobe[sizeof(modprobe) - 1] = '\0'; - ret = system(modprobe); - if (ret == -1) { - ERR("Unable to launch modprobe -r for module %s", - kern_modules_list[i].name); - } else if (kern_modules_list[i].required - && WEXITSTATUS(ret) != 0) { - ERR("Unable to remove module %s", - kern_modules_list[i].name); - } else { - DBG("Modprobe removal successful %s", - kern_modules_list[i].name); - } - } - -error: - return; + return modprobe_remove_lttng(kern_modules_probes, + ARRAY_SIZE(kern_modules_probes), + LTTNG_MOD_OPTIONAL); } /* @@ -149,19 +151,17 @@ void modprobe_remove_lttng_all(void) modprobe_remove_lttng_control(); } -/* - * Load control kernel module(s). - */ -int modprobe_lttng_control(void) +static int modprobe_lttng(const struct kern_modules_param *modules, + int entries, int required) { int ret = 0, i; char modprobe[256]; - for (i = 0; i < ARRAY_SIZE(kern_modules_control); i++) { + for (i = 0; i < entries; i++) { ret = snprintf(modprobe, sizeof(modprobe), "/sbin/modprobe %s%s", - kern_modules_control[i].required ? "" : "-q ", - kern_modules_control[i].name); + required ? "" : "-q ", + modules[i].name); if (ret < 0) { PERROR("snprintf modprobe"); goto error; @@ -170,14 +170,11 @@ int modprobe_lttng_control(void) ret = system(modprobe); if (ret == -1) { ERR("Unable to launch modprobe for module %s", - kern_modules_control[i].name); - } else if (kern_modules_control[i].required - && WEXITSTATUS(ret) != 0) { - ERR("Unable to load module %s", - kern_modules_control[i].name); + modules[i].name); + } else if (required && WEXITSTATUS(ret) != 0) { + ERR("Unable to load module %s", modules[i].name); } else { - DBG("Modprobe successfully %s", - kern_modules_control[i].name); + DBG("Modprobe successfully %s", modules[i].name); } } @@ -186,58 +183,29 @@ error: } /* - * Load data kernel module(s). + * Load control kernel module(s). */ -int modprobe_lttng_data(void) +int modprobe_lttng_control(void) { - int ret = 0, i; - char modprobe[256]; - - for (i = 0; i < ARRAY_SIZE(kern_modules_list); i++) { - ret = snprintf(modprobe, sizeof(modprobe), - "/sbin/modprobe %s%s", - kern_modules_list[i].required ? "" : "-q ", - kern_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", - kern_modules_list[i].name); - } else if (kern_modules_list[i].required - && WEXITSTATUS(ret) != 0) { - ERR("Unable to load module %s", - kern_modules_list[i].name); - } else { - DBG("Modprobe successfully %s", - kern_modules_list[i].name); - } - } + int ret; -error: + 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; } /* - * Load all lttng kernel modules. + * Load data kernel module(s). */ -int modprobe_lttng_all(void) +int modprobe_lttng_data(void) { - int ret; - - ret = modprobe_lttng_control(); - if (ret < 0) { - goto error; - } - - ret = modprobe_lttng_data(); - if (ret < 0) { - goto error; - } - -error: - return ret; + return modprobe_lttng(kern_modules_probes, + ARRAY_SIZE(kern_modules_probes), + LTTNG_MOD_OPTIONAL); }