Add builtin modules support to kmod modprobe
[lttng-tools.git] / src / bin / lttng-sessiond / modprobe.c
index 90fec711b8120c740d0ac4d48239b68c7db097c4..ca0467eb37973f169cdebc7966bbb613e83285a9 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+/**
+ * @file modprobe.c
+ *
+ * @brief modprobe related functions.
+ *
+ */
+
 #define _LGPL_SOURCE
 #include <assert.h>
 #include <stdio.h>
@@ -93,6 +100,9 @@ static int probes_capacity;
 #if HAVE_KMOD
 #include <libkmod.h>
 
+/**
+ * @brief Logging function for libkmod integration.
+ */
 static void log_kmod(void *data, int priority, const char *file, int line,
                const char *fn, const char *format, va_list args)
 {
@@ -106,6 +116,15 @@ static void log_kmod(void *data, int priority, const char *file, int line,
        free(str);
 }
 
+/**
+ * @brief Setup the libkmod context.
+ *
+ * Create the context, add a custom logging function and preload the
+ * ressources for faster operation.
+ *
+ * @returns    \c 0 on success
+ *             \c < 0 on error
+ */
 static int setup_kmod_ctx(struct kmod_ctx **ctx)
 {
        int ret = 0;
@@ -128,6 +147,19 @@ error:
        return ret;
 }
 
+/**
+ * @brief Loads the kernel modules in \p modules
+ *
+ * @param modules      List of modules to load
+ * @param entries      Number of modules in the list
+ * @param required     Are the modules required or optionnal
+ *
+ * If the modules are required, we will return with error after the
+ * first failed module load, otherwise we continue loading.
+ *
+ * @returns            \c 0 on success
+ *                     \c < 0 on error
+ */
 static int modprobe_lttng(struct kern_modules_param *modules,
                int entries, int required)
 {
@@ -148,9 +180,12 @@ static int modprobe_lttng(struct kern_modules_param *modules,
                        goto error;
                }
 
-               ret = kmod_module_probe_insert_module(mod, KMOD_PROBE_IGNORE_LOADED,
+               ret = kmod_module_probe_insert_module(mod, 0,
                                NULL, NULL, NULL, NULL);
-               if (ret < 0) {
+               if (ret == -EEXIST) {
+                       DBG("Module %s is already loaded", modules[i].name);
+                       ret = 0;
+               } else if (ret < 0) {
                        if (required) {
                                ERR("Unable to load required module %s",
                                                modules[i].name);
@@ -174,6 +209,18 @@ error:
        return ret;
 }
 
+/**
+ * @brief Recursively unload modules.
+ *
+ * This function implements the same modules unloading behavior as
+ * 'modprobe -r' or rmmod, it will recursevily go trought the \p module
+ * dependencies and unload modules with a refcount of 0.
+ *
+ * @param mod          The module to unload
+ *
+ * @returns            \c 0 on success
+ *                     \c < 0 on error
+ */
 static int rmmod_recurse(struct kmod_module *mod) {
        int ret = 0;
        struct kmod_list *deps, *itr;
@@ -202,6 +249,14 @@ static int rmmod_recurse(struct kmod_module *mod) {
        return ret;
 }
 
+/**
+ * @brief Unloads the kernel modules in \p modules
+ *
+ * @param modules      List of modules to unload
+ * @param entries      Number of modules in the list
+ * @param required     Are the modules required or optionnal
+ *
+ */
 static void modprobe_remove_lttng(const struct kern_modules_param *modules,
                int entries, int required)
 {
This page took 0.025431 seconds and 4 git commands to generate.