Load modules through kmod
authorUmut Tezduyar Lindskog <umut.tezduyar@axis.com>
Thu, 4 Sep 2014 08:30:53 +0000 (10:30 +0200)
committerDavid Goulet <dgoulet@efficios.com>
Mon, 8 Sep 2014 19:34:59 +0000 (15:34 -0400)
Instead of forking processes, load modules through libkmod.

This adds an optional package dependency to kmod but can be disabled by
--disable-kmod option in ./configure. If --enable-kmod option is given
but no kmod is found, loading will happen by forking a process.

The startup time has decreased by %36 on our embedded mips product. The
measurement is done by cgroup cpu shares.

Signed-off-by: David Goulet <dgoulet@efficios.com>
configure.ac
src/bin/lttng-sessiond/modprobe.c

index a8e04f5ab5cd39b44ba4edaf5be4a5e4629d3f39..3ec407623e9237449523f645f7d37c043105f329 100644 (file)
@@ -200,6 +200,32 @@ AC_CHECK_DECL([cmm_smp_mb__before_uatomic_or], [],
         [AC_MSG_ERROR([liburcu $liburcu_version or newer is needed])], [[#include <urcu.h>]]
 )
 
+# Check kmod library
+AC_ARG_WITH(kmod-prefix,
+  AS_HELP_STRING([--with-kmod-prefix=PATH],
+               [Specify the installation prefix of the kmod library.
+               Headers must be in PATH/include; libraries in PATH/lib.]),
+               [
+                       CPPFLAGS="$CPPFLAGS -I${withval}/include"
+                       LDFLAGS="$LDFLAGS -L${withval}/lib64 -L${withval}/lib"
+               ])
+
+AC_ARG_ENABLE(kmod,
+       AS_HELP_STRING([--disable-kmod],[build without kmod support]),
+       kmod_support=zz$enableval, kmod_support=yes)
+
+AS_IF([test "x$kmod_support" = "xyes"], [
+       AC_CHECK_LIB([kmod], [kmod_module_probe_insert_module],
+               [
+                       AC_DEFINE([HAVE_KMOD], [1], [has kmod support])
+                       LIBS="$LIBS -lkmod"
+                       kmod_found=yes
+               ],
+               kmod_found=no
+       )
+])
+AM_CONDITIONAL([HAVE_KMOD], [test "x$kmod_found" = xyes])
+
 AC_ARG_WITH(lttng-ust-prefix,
   AS_HELP_STRING([--with-lttng-ust-prefix=PATH],
                  [Specify the installation prefix of the lttng-ust library.
@@ -483,6 +509,14 @@ done
 AS_ECHO_N("Target architecture: ")
 AS_ECHO($target_arch)
 
+# kmod enabled/disabled
+AS_ECHO_N("libkmod support: ")
+AS_IF([test "x$kmod_found" = "xyes"],[
+       AS_ECHO("Enabled")
+],[
+       AS_ECHO("Disabled")
+])
+
 # LTTng-UST enabled/disabled
 AS_ECHO_N("Lttng-UST support: ")
 AS_IF([test "x$lttng_ust_support" = "xyes"],[
index 3cc67f0b92c43ffe480159a42b7cc850ce19ec37..968b2650e05c9685fc04b3e56e29bb5fb87cd1ae 100644 (file)
@@ -164,8 +164,67 @@ void modprobe_remove_lttng_all(void)
        modprobe_remove_lttng_control();
 }
 
+#if HAVE_KMOD
+#include <libkmod.h>
+static void log_kmod(void *data, int priority, const char *file, int line,
+               const char *fn, const char *format, va_list args)
+{
+       char *str;
+
+       if (vasprintf(&str, format, args) < 0) {
+               return;
+       }
+
+       DBG("libkmod: %s", str);
+       free(str);
+}
+static int modprobe_lttng(struct kern_modules_param *modules,
+               int entries, int required)
+{
+       int ret = 0, i;
+       struct kmod_ctx *ctx;
+
+       ctx = kmod_new(NULL, NULL);
+       if (!ctx) {
+               PERROR("Unable to create kmod library context");
+               ret = -ENOMEM;
+               goto error;
+       }
+
+       kmod_set_log_fn(ctx, log_kmod, NULL);
+       kmod_load_resources(ctx);
+
+       for (i = 0; i < entries; i++) {
+               struct kmod_module *mod = NULL;
+
+               ret = kmod_module_new_from_name(ctx, modules[i].name, &mod);
+               if (ret < 0) {
+                       PERROR("Failed to create kmod module for %s", modules[i].name);
+                       goto error;
+               }
+
+               ret = kmod_module_probe_insert_module(mod, KMOD_PROBE_IGNORE_LOADED,
+                               NULL, NULL, NULL, NULL);
+               if (required && ret < 0) {
+                       ERR("Unable to load module %s", modules[i].name);
+               } else {
+                       DBG("Modprobe successfully %s", modules[i].name);
+               }
+
+               kmod_module_unref(mod);
+       }
+
+error:
+       if (ctx) {
+               kmod_unref(ctx);
+       }
+       return ret;
+}
+
+#else /* HAVE_KMOD */
+
 static int modprobe_lttng(struct kern_modules_param *modules,
-                         int entries, int required)
+               int entries, int required)
 {
        int ret = 0, i;
        char modprobe[256];
@@ -195,6 +254,8 @@ error:
        return ret;
 }
 
+#endif /* HAVE_KMOD */
+
 /*
  * Load control kernel module(s).
  */
This page took 0.036732 seconds and 4 git commands to generate.