[lttng-dev] [PATCH lttng-tools] Load modules through kmod
Umut Tezduyar Lindskog
umut.tezduyar at axis.com
Tue Aug 26 10:27:46 EDT 2014
Instead of forking processes, load modules through libkmod.
This adds a package dependency to kmod but can be disabled
by --disable-kmod option in ./configure.
The startup time has decreased by %36 on our embedded mips
product. The measurement is done by cgroup cpu shares.
---
configure.ac | 34 ++++++++++++++++++++++++
src/bin/lttng-sessiond/modprobe.c | 53 +++++++++++++++++++++++++++++++++++++
2 files changed, 87 insertions(+)
diff --git a/configure.ac b/configure.ac
index a8e04f5..b36a95d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -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=$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
+ ],
+ [AC_MSG_ERROR([Cannot find kmod >= 5. Use --with-kmod-prefix=PREFIX to specify its location, or specify --disable-kmod to build lttng-tools without kmod support.])]
+ )
+])
+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("kmod support: ")
+AS_IF([test "x$kmod_support" = "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"],[
diff --git a/src/bin/lttng-sessiond/modprobe.c b/src/bin/lttng-sessiond/modprobe.c
index 3cc67f0..40a2ee0 100644
--- a/src/bin/lttng-sessiond/modprobe.c
+++ b/src/bin/lttng-sessiond/modprobe.c
@@ -164,6 +164,58 @@ 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
static int modprobe_lttng(struct kern_modules_param *modules,
int entries, int required)
{
@@ -194,6 +246,7 @@ static int modprobe_lttng(struct kern_modules_param *modules,
error:
return ret;
}
+#endif
/*
* Load control kernel module(s).
--
1.7.10.4
More information about the lttng-dev
mailing list