Use compiler-agnostic defines to silence warning
[lttng-tools.git] / src / bin / lttng-sessiond / modprobe.cpp
... / ...
CommitLineData
1/*
2 * Copyright (C) 2011 David Goulet <dgoulet@efficios.com>
3 * Copyright (C) 2014 Jan Glauber <jan.glauber@gmail.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-only
6 *
7 */
8
9/**
10 * @file modprobe.c
11 *
12 * @brief modprobe related functions.
13 *
14 */
15
16#define _LGPL_SOURCE
17#include "kern-modules.hpp"
18#include "lttng-sessiond.hpp"
19#include "modprobe.hpp"
20
21#include <common/common.hpp>
22#include <common/utils.hpp>
23
24#include <stdio.h>
25#include <stdlib.h>
26#include <sys/wait.h>
27
28/* LTTng kernel tracer mandatory core modules list */
29struct kern_modules_param kern_modules_control_core[] = {
30 {
31 .name = (char *) "lttng-wrapper",
32 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED,
33 .loaded = false,
34 },
35 {
36 .name = (char *) "lttng-statedump",
37 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED,
38 .loaded = false,
39 },
40 {
41 .name = (char *) "lttng-clock",
42 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED,
43 .loaded = false,
44 },
45 {
46 .name = (char *) "lttng-lib-ring-buffer",
47 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED,
48 .loaded = false,
49 },
50 {
51 .name = (char *) "lttng-ring-buffer-client-discard",
52 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED,
53 .loaded = false,
54 },
55 {
56 .name = (char *) "lttng-ring-buffer-client-overwrite",
57 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED,
58 .loaded = false,
59 },
60 {
61 .name = (char *) "lttng-ring-buffer-metadata-client",
62 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED,
63 .loaded = false,
64 },
65 {
66 .name = (char *) "lttng-ring-buffer-client-mmap-discard",
67 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED,
68 .loaded = false,
69 },
70 {
71 .name = (char *) "lttng-ring-buffer-client-mmap-overwrite",
72 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED,
73 .loaded = false,
74 },
75 {
76 .name = (char *) "lttng-ring-buffer-metadata-mmap-client",
77 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED,
78 .loaded = false,
79 },
80 {
81 .name = (char *) "lttng-ring-buffer-event_notifier-client",
82 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
83 .loaded = false,
84 },
85 {
86 .name = (char *) "lttng-counter-client-percpu-64-modular",
87 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
88 .loaded = false,
89 },
90 {
91 .name = (char *) "lttng-counter-client-percpu-32-modular",
92 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
93 .loaded = false,
94 },
95};
96
97/* LTTng kerneltracer probe modules list */
98struct kern_modules_param kern_modules_probes_default[] = {
99 {
100 .name = (char *) "lttng-probe-asoc",
101 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
102 .loaded = false,
103 },
104 {
105 .name = (char *) "lttng-probe-block",
106 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
107 .loaded = false,
108 },
109 {
110 .name = (char *) "lttng-probe-btrfs",
111 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
112 .loaded = false,
113 },
114 {
115 .name = (char *) "lttng-probe-compaction",
116 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
117 .loaded = false,
118 },
119 {
120 .name = (char *) "lttng-probe-ext3",
121 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
122 .loaded = false,
123 },
124 {
125 .name = (char *) "lttng-probe-ext4",
126 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
127 .loaded = false,
128 },
129 {
130 .name = (char *) "lttng-probe-gpio",
131 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
132 .loaded = false,
133 },
134 {
135 .name = (char *) "lttng-probe-i2c",
136 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
137 .loaded = false,
138 },
139 {
140 .name = (char *) "lttng-probe-irq",
141 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
142 .loaded = false,
143 },
144 {
145 .name = (char *) "lttng-probe-jbd",
146 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
147 .loaded = false,
148 },
149 {
150 .name = (char *) "lttng-probe-jbd2",
151 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
152 .loaded = false,
153 },
154 {
155 .name = (char *) "lttng-probe-kmem",
156 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
157 .loaded = false,
158 },
159 {
160 .name = (char *) "lttng-probe-kvm",
161 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
162 .loaded = false,
163 },
164 {
165 .name = (char *) "lttng-probe-kvm-x86",
166 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
167 .loaded = false,
168 },
169 {
170 .name = (char *) "lttng-probe-kvm-x86-mmu",
171 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
172 .loaded = false,
173 },
174 {
175 .name = (char *) "lttng-probe-lock",
176 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
177 .loaded = false,
178 },
179 {
180 .name = (char *) "lttng-probe-module",
181 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
182 .loaded = false,
183 },
184 {
185 .name = (char *) "lttng-probe-napi",
186 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
187 .loaded = false,
188 },
189 {
190 .name = (char *) "lttng-probe-net",
191 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
192 .loaded = false,
193 },
194 {
195 .name = (char *) "lttng-probe-power",
196 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
197 .loaded = false,
198 },
199 {
200 .name = (char *) "lttng-probe-preemptirq",
201 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
202 .loaded = false,
203 },
204 {
205 .name = (char *) "lttng-probe-printk",
206 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
207 .loaded = false,
208 },
209 {
210 .name = (char *) "lttng-probe-random",
211 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
212 .loaded = false,
213 },
214 {
215 .name = (char *) "lttng-probe-rcu",
216 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
217 .loaded = false,
218 },
219 {
220 .name = (char *) "lttng-probe-regmap",
221 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
222 .loaded = false,
223 },
224 {
225 .name = (char *) "lttng-probe-regulator",
226 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
227 .loaded = false,
228 },
229 {
230 .name = (char *) "lttng-probe-rpm",
231 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
232 .loaded = false,
233 },
234 {
235 .name = (char *) "lttng-probe-sched",
236 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
237 .loaded = false,
238 },
239 {
240 .name = (char *) "lttng-probe-scsi",
241 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
242 .loaded = false,
243 },
244 {
245 .name = (char *) "lttng-probe-signal",
246 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
247 .loaded = false,
248 },
249 {
250 .name = (char *) "lttng-probe-skb",
251 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
252 .loaded = false,
253 },
254 {
255 .name = (char *) "lttng-probe-sock",
256 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
257 .loaded = false,
258 },
259 {
260 .name = (char *) "lttng-probe-statedump",
261 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
262 .loaded = false,
263 },
264 {
265 .name = (char *) "lttng-probe-sunrpc",
266 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
267 .loaded = false,
268 },
269 {
270 .name = (char *) "lttng-probe-timer",
271 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
272 .loaded = false,
273 },
274 {
275 .name = (char *) "lttng-probe-udp",
276 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
277 .loaded = false,
278 },
279 {
280 .name = (char *) "lttng-probe-vmscan",
281 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
282 .loaded = false,
283 },
284 {
285 .name = (char *) "lttng-probe-v4l2",
286 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
287 .loaded = false,
288 },
289 {
290 .name = (char *) "lttng-probe-workqueue",
291 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
292 .loaded = false,
293 },
294 {
295 .name = (char *) "lttng-probe-writeback",
296 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
297 .loaded = false,
298 },
299 {
300 .name = (char *) "lttng-probe-x86-irq-vectors",
301 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
302 .loaded = false,
303 },
304 {
305 .name = (char *) "lttng-probe-x86-exceptions",
306 .load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL,
307 .loaded = false,
308 },
309};
310
311/* dynamic probe modules list */
312static struct kern_modules_param *probes;
313static int nr_probes;
314static int probes_capacity;
315
316#ifdef HAVE_KMOD
317#include <libkmod.h>
318
319/**
320 * @brief Logging function for libkmod integration.
321 */
322static ATTR_FORMAT_PRINTF(6, 0) void log_kmod(void *data __attribute__((unused)),
323 int priority __attribute__((unused)),
324 const char *file __attribute__((unused)),
325 int line __attribute__((unused)),
326 const char *fn __attribute__((unused)),
327 const char *format,
328 va_list args)
329{
330 char *str;
331
332 if (vasprintf(&str, format, args) < 0) {
333 return;
334 }
335
336 DBG("libkmod: %s", str);
337 free(str);
338}
339
340/**
341 * @brief Setup the libkmod context.
342 *
343 * Create the context, add a custom logging function and preload the
344 * ressources for faster operation.
345 *
346 * @returns \c 0 on success
347 * \c < 0 on error
348 */
349static int setup_kmod_ctx(struct kmod_ctx **ctx)
350{
351 int ret = 0;
352
353 *ctx = kmod_new(nullptr, nullptr);
354 if (!ctx) {
355 PERROR("Unable to create kmod library context");
356 ret = -ENOMEM;
357 goto error;
358 }
359
360 /*
361 * Parameter 2 of kmod_set_log_fn generates a
362 * -Wsuggest-attribute=formatkmod_set_log_fn warning that we can't fix,
363 * ignore it.
364 */
365 DIAGNOSTIC_PUSH
366 DIAGNOSTIC_IGNORE_SUGGEST_ATTRIBUTE_FORMAT
367 kmod_set_log_fn(*ctx, log_kmod, nullptr);
368 DIAGNOSTIC_POP
369 ret = kmod_load_resources(*ctx);
370 if (ret < 0) {
371 ERR("Failed to load kmod library resources");
372 goto error;
373 }
374
375error:
376 return ret;
377}
378
379/**
380 * @brief Loads the kernel modules in \p modules
381 *
382 * @param modules List of modules to load
383 * @param entries Number of modules in the list
384 *
385 * If the modules are required, we will return with error after the
386 * first failed module load, otherwise we continue loading.
387 *
388 * @returns \c 0 on success
389 * \c < 0 on error
390 */
391static int modprobe_lttng(struct kern_modules_param *modules, int entries)
392{
393 int ret = 0, i;
394 struct kmod_ctx *ctx;
395
396 ret = setup_kmod_ctx(&ctx);
397 if (ret < 0) {
398 goto error;
399 }
400
401 for (i = 0; i < entries; i++) {
402 struct kmod_module *mod = nullptr;
403
404 ret = kmod_module_new_from_name(ctx, modules[i].name, &mod);
405 if (ret < 0) {
406 PERROR("Failed to create kmod module for %s", modules[i].name);
407 goto error;
408 }
409
410 ret = kmod_module_probe_insert_module(mod, 0, nullptr, nullptr, nullptr, nullptr);
411 if (ret == -EEXIST) {
412 DBG("Module %s is already loaded", modules[i].name);
413 ret = 0;
414 } else if (ret < 0) {
415 if (modules[i].load_policy == KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED) {
416 PERROR("Unable to load required module `%s`", modules[i].name)
417 goto error;
418 } else {
419 PERROR("Unable to load optional module `%s`; continuing",
420 modules[i].name);
421 ret = 0;
422 }
423 } else {
424 DBG("Modprobe successfully %s", modules[i].name);
425 modules[i].loaded = true;
426 }
427
428 kmod_module_unref(mod);
429 }
430
431error:
432 if (ctx) {
433 kmod_unref(ctx);
434 }
435 return ret;
436}
437
438/**
439 * @brief Recursively unload modules.
440 *
441 * This function implements the same modules unloading behavior as
442 * 'modprobe -r' or rmmod, it will recursevily go trought the \p module
443 * dependencies and unload modules with a refcount of 0.
444 *
445 * @param mod The module to unload
446 *
447 * @returns \c 0 on success
448 * \c < 0 on error
449 */
450static int rmmod_recurse(struct kmod_module *mod)
451{
452 int ret = 0;
453 struct kmod_list *deps, *itr;
454
455 if (kmod_module_get_initstate(mod) == KMOD_MODULE_BUILTIN) {
456 DBG("Module %s is builtin", kmod_module_get_name(mod));
457 return ret;
458 }
459
460 ret = kmod_module_remove_module(mod, 0);
461
462 deps = kmod_module_get_dependencies(mod);
463 if (deps != nullptr) {
464 kmod_list_foreach(itr, deps)
465 {
466 struct kmod_module *dep = kmod_module_get_module(itr);
467 if (kmod_module_get_refcnt(dep) == 0) {
468 DBG("Recursive remove module %s", kmod_module_get_name(dep));
469 rmmod_recurse(dep);
470 }
471 kmod_module_unref(dep);
472 }
473 kmod_module_unref_list(deps);
474 }
475
476 return ret;
477}
478
479/**
480 * @brief Unloads the kernel modules in \p modules
481 *
482 * @param modules List of modules to unload
483 * @param entries Number of modules in the list
484 *
485 */
486static void modprobe_remove_lttng(const struct kern_modules_param *modules, int entries)
487{
488 int ret = 0, i;
489 struct kmod_ctx *ctx;
490
491 ret = setup_kmod_ctx(&ctx);
492 if (ret < 0) {
493 goto error;
494 }
495
496 for (i = entries - 1; i >= 0; i--) {
497 struct kmod_module *mod = nullptr;
498
499 if (!modules[i].loaded) {
500 continue;
501 }
502
503 ret = kmod_module_new_from_name(ctx, modules[i].name, &mod);
504 if (ret < 0) {
505 PERROR("Failed to create kmod module for %s", modules[i].name);
506 goto error;
507 }
508
509 ret = rmmod_recurse(mod);
510 if (ret == -EEXIST) {
511 DBG("Module %s is not in kernel.", modules[i].name);
512 } else if (modules[i].load_policy == KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED &&
513 ret < 0) {
514 PERROR("Unable to remove module `%s`", modules[i].name);
515 } else {
516 DBG("Modprobe removal successful %s", modules[i].name);
517 }
518
519 kmod_module_unref(mod);
520 }
521
522error:
523 if (ctx) {
524 kmod_unref(ctx);
525 }
526}
527
528#else /* HAVE_KMOD */
529
530static int modprobe_lttng(struct kern_modules_param *modules, int entries)
531{
532 int ret = 0, i;
533 char modprobe[256];
534
535 for (i = 0; i < entries; i++) {
536 ret = snprintf(modprobe,
537 sizeof(modprobe),
538 "/sbin/modprobe %s%s",
539 modules[i].load_policy ==
540 KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED ?
541 "" :
542 "-q ",
543 modules[i].name);
544 if (ret < 0) {
545 PERROR("snprintf modprobe");
546 goto error;
547 }
548 modprobe[sizeof(modprobe) - 1] = '\0';
549 ret = system(modprobe);
550 if (ret == -1) {
551 if (modules[i].load_policy == KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED) {
552 ERR("Unable to launch modprobe for required module %s",
553 modules[i].name);
554 goto error;
555 } else {
556 DBG("Unable to launch modprobe for optional module %s; continuing",
557 modules[i].name);
558 ret = 0;
559 }
560 } else if (WEXITSTATUS(ret) != 0) {
561 if (modules[i].load_policy == KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED) {
562 ERR("Unable to load required module %s", modules[i].name);
563 /* Force negative return code */
564 if (ret > 0) {
565 ret = -ret;
566 }
567 goto error;
568 } else {
569 DBG("Unable to load optional module %s; continuing",
570 modules[i].name);
571 ret = 0;
572 }
573 } else {
574 DBG("Modprobe successfully %s", modules[i].name);
575 modules[i].loaded = true;
576 }
577 }
578
579error:
580 return ret;
581}
582
583static void modprobe_remove_lttng(const struct kern_modules_param *modules, int entries)
584{
585 int ret = 0, i;
586 char modprobe[256];
587
588 for (i = entries - 1; i >= 0; i--) {
589 if (!modules[i].loaded) {
590 continue;
591 }
592 ret = snprintf(
593 modprobe, sizeof(modprobe), "/sbin/modprobe -r -q %s", modules[i].name);
594 if (ret < 0) {
595 PERROR("snprintf modprobe -r");
596 return;
597 }
598 modprobe[sizeof(modprobe) - 1] = '\0';
599 ret = system(modprobe);
600 if (ret == -1) {
601 if (modules[i].load_policy == KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED) {
602 ERR("Unable to launch modprobe -r for required module %s",
603 modules[i].name);
604 } else {
605 DBG("Unable to launch modprobe -r for optional module %s",
606 modules[i].name);
607 }
608 } else if (WEXITSTATUS(ret) != 0) {
609 if (modules[i].load_policy == KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED) {
610 ERR("Unable to remove required module %s", modules[i].name);
611 } else {
612 DBG("Unable to remove optional module %s", modules[i].name);
613 }
614 } else {
615 DBG("Modprobe removal successful %s", modules[i].name);
616 }
617 }
618}
619
620#endif /* HAVE_KMOD */
621
622/*
623 * Remove control kernel module(s) in reverse load order.
624 */
625void modprobe_remove_lttng_control()
626{
627 modprobe_remove_lttng(kern_modules_control_core, ARRAY_SIZE(kern_modules_control_core));
628}
629
630static void free_probes()
631{
632 int i;
633
634 if (!probes) {
635 return;
636 }
637 for (i = 0; i < nr_probes; ++i) {
638 free(probes[i].name);
639 }
640 free(probes);
641 probes = nullptr;
642 nr_probes = 0;
643}
644
645/*
646 * Remove data kernel modules in reverse load order.
647 */
648void modprobe_remove_lttng_data()
649{
650 if (!probes) {
651 return;
652 }
653
654 modprobe_remove_lttng(probes, nr_probes);
655 free_probes();
656}
657
658/*
659 * Remove all kernel modules in reverse order.
660 */
661void modprobe_remove_lttng_all()
662{
663 modprobe_remove_lttng_data();
664 modprobe_remove_lttng_control();
665}
666
667/*
668 * Load control kernel module(s).
669 */
670int modprobe_lttng_control()
671{
672 return modprobe_lttng(kern_modules_control_core, ARRAY_SIZE(kern_modules_control_core));
673}
674
675/**
676 * Grow global list of probes (double capacity or set it to 1 if
677 * currently 0 and copy existing data).
678 */
679static int grow_probes()
680{
681 int i;
682 struct kern_modules_param *tmp_probes;
683
684 /* Initialize capacity to 1 if 0. */
685 if (probes_capacity == 0) {
686 probes = zmalloc<kern_modules_param>();
687 if (!probes) {
688 PERROR("malloc probe list");
689 return -ENOMEM;
690 }
691
692 probes_capacity = 1;
693 return 0;
694 }
695
696 /* Double size. */
697 probes_capacity *= 2;
698
699 tmp_probes = calloc<kern_modules_param>(probes_capacity);
700 if (!tmp_probes) {
701 PERROR("malloc probe list");
702 return -ENOMEM;
703 }
704
705 for (i = 0; i < nr_probes; ++i) {
706 /* Ownership of 'name' field is transferred. */
707 tmp_probes[i] = probes[i];
708 }
709
710 /* Replace probes with larger copy. */
711 free(probes);
712 probes = tmp_probes;
713
714 return 0;
715}
716
717/*
718 * Appends a comma-separated list of probes to the global list
719 * of probes.
720 */
721static int append_list_to_probes(const char *list)
722{
723 char *next;
724 int ret;
725 char *tmp_list, *cur_list, *saveptr;
726
727 LTTNG_ASSERT(list);
728
729 cur_list = tmp_list = strdup(list);
730 if (!tmp_list) {
731 PERROR("strdup temp list");
732 return -ENOMEM;
733 }
734
735 for (;;) {
736 size_t name_len;
737 struct kern_modules_param *cur_mod;
738
739 next = strtok_r(cur_list, ",", &saveptr);
740 if (!next) {
741 break;
742 }
743 cur_list = nullptr;
744
745 /* filter leading spaces */
746 while (*next == ' ') {
747 next++;
748 }
749
750 if (probes_capacity <= nr_probes) {
751 ret = grow_probes();
752 if (ret) {
753 goto error;
754 }
755 }
756
757 /* Length 13 is "lttng-probe-" + \0 */
758 name_len = strlen(next) + 13;
759
760 cur_mod = &probes[nr_probes];
761 cur_mod->name = calloc<char>(name_len);
762 if (!cur_mod->name) {
763 PERROR("malloc probe list");
764 ret = -ENOMEM;
765 goto error;
766 }
767
768 ret = snprintf(cur_mod->name, name_len, "lttng-probe-%s", next);
769 if (ret < 0) {
770 PERROR("snprintf modprobe name");
771 ret = -ENOMEM;
772 goto error;
773 }
774
775 cur_mod->load_policy = KERNEL_MODULE_PROPERTY_LOAD_POLICY_OPTIONAL;
776
777 nr_probes++;
778 }
779
780 free(tmp_list);
781 return 0;
782
783error:
784 free(tmp_list);
785 free_probes();
786 return ret;
787}
788
789/*
790 * Load data kernel module(s).
791 */
792int modprobe_lttng_data()
793{
794 int ret, i;
795 char *list;
796
797 /*
798 * Base probes: either from command line option, environment
799 * variable or default list.
800 */
801 list = the_config.kmod_probes_list.value;
802 if (list) {
803 /* User-specified probes. */
804 ret = append_list_to_probes(list);
805 if (ret) {
806 return ret;
807 }
808 } else {
809 /* Default probes. */
810 const int def_len = ARRAY_SIZE(kern_modules_probes_default);
811
812 probes = calloc<kern_modules_param>(def_len);
813 if (!probes) {
814 PERROR("malloc probe list");
815 return -ENOMEM;
816 }
817
818 nr_probes = probes_capacity = def_len;
819
820 for (i = 0; i < def_len; ++i) {
821 char *name = strdup(kern_modules_probes_default[i].name);
822
823 if (!name) {
824 PERROR("strdup probe item");
825 ret = -ENOMEM;
826 goto error;
827 }
828
829 probes[i].name = name;
830 probes[i].load_policy = kern_modules_probes_default[i].load_policy;
831 }
832 }
833
834 /*
835 * Extra modules? Append them to current probes list.
836 */
837 list = the_config.kmod_extra_probes_list.value;
838 if (list) {
839 ret = append_list_to_probes(list);
840 if (ret) {
841 goto error;
842 }
843 }
844
845 /*
846 * Load probes modules now.
847 */
848 ret = modprobe_lttng(probes, nr_probes);
849 if (ret) {
850 goto error;
851 }
852 return ret;
853
854error:
855 free_probes();
856 return ret;
857}
This page took 0.026023 seconds and 5 git commands to generate.