Hi David, I did a respin to add the command line option and the man page description. If you still want the config file support please answer my previous questions.
V2 Changes: - add command line option --kmod-probes to lttng-sessiond Note: The command line option only works if lttng-sessiond is started manually because the lttng tool does currently not pass the option to the lttng-sessiond. - document command line option and env variable in man page - change the env variable delimeter to "," instead of ":" and allow spaces in the list - rename the env variable to LTTNG_KMOD_PROBES Create a kernel module probes list and use it to load the specified probes. The probes are selectable by the --kmod-probes command line option to lttng-sessiond or the LTTNG_KMOD_PROBES environment variable. If neither is set all probes are loaded so the current behaviour is not changed. Signed-off-by: Jan Glauber <jan.glau...@gmail.com> --- doc/man/lttng-sessiond.8 | 7 +++ src/bin/lttng-sessiond/kern-modules.h | 2 +- src/bin/lttng-sessiond/main.c | 5 ++ src/bin/lttng-sessiond/modprobe.c | 87 +++++++++++++++++++++++++++------ src/bin/lttng-sessiond/modprobe.h | 2 + src/common/defaults.h | 3 ++ src/common/utils.c | 10 ++++ src/common/utils.h | 1 + 8 files changed, 102 insertions(+), 15 deletions(-) diff --git a/doc/man/lttng-sessiond.8 b/doc/man/lttng-sessiond.8 index 633cf81..133c69f 100644 --- a/doc/man/lttng-sessiond.8 +++ b/doc/man/lttng-sessiond.8 @@ -81,6 +81,11 @@ No kernel tracer support .BR " --jul-tcp-port" JUL application registration TCP port (default: 5345) .TP +.BR " --kmod-probes=probe1, probe2, ..." +Specify the kernel modules containing LTTng probes to load by the session daemon. +Only the component name of the probe needs to be specified, e.g. to load the +lttng-probe-irq and lttng-probe-sched use: --kmod-probes="irq, sched". +.TP .BR "-c, --client-sock=PATH" Specify path for the client unix socket .TP @@ -150,6 +155,8 @@ parameter: the timeout value, in milliseconds. A value of 0 or -1 uses the timeout of the operating system (this is the default). .IP "LTTNG_SESSION_CONFIG_XSD_PATH" Specify the path that contains the XML session configuration schema (xsd). +.IP "LTTNG_KMOD_PROBES" +Specify the kernel modules probes that should be loaded by the session daemon. .SH "SEE ALSO" .PP diff --git a/src/bin/lttng-sessiond/kern-modules.h b/src/bin/lttng-sessiond/kern-modules.h index ca09fc3..26f4457 100644 --- a/src/bin/lttng-sessiond/kern-modules.h +++ b/src/bin/lttng-sessiond/kern-modules.h @@ -28,7 +28,7 @@ #define KERN_MODULES_MINOR 0 struct kern_modules_param { - const char *name; + char *name; }; #endif /* _KERN_MODULES_H */ diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c index 052e32e..c90cfe1 100644 --- a/src/bin/lttng-sessiond/main.c +++ b/src/bin/lttng-sessiond/main.c @@ -152,6 +152,7 @@ static const struct option long_options[] = { { "pidfile", 1, 0, 'p' }, { "jul-tcp-port", 1, 0, 'J' }, { "config", 1, 0, 'f' }, + { "kmod-probes", 1, 0, 'P' }, { NULL, 0, 0, 0 } }; @@ -4110,6 +4111,7 @@ static void usage(void) fprintf(stderr, " --no-kernel Disable kernel tracer\n"); fprintf(stderr, " --jul-tcp-port JUL application registration TCP port\n"); fprintf(stderr, " -f --config Load daemon configuration file\n"); + fprintf(stderr, " --kmod-probes Specify kernel module probes to load\n"); } /* @@ -4229,6 +4231,9 @@ static int set_option(int opt, const char *arg, const char *optname) DBG3("JUL TCP port set to non default: %u", jul_tcp_port); break; } + case 'P': /* probe modules list */ + kmod_probes_list = strdup(arg); + break; default: /* Unknown option or other error. * Error is printed by getopt, just return */ diff --git a/src/bin/lttng-sessiond/modprobe.c b/src/bin/lttng-sessiond/modprobe.c index 4648e8b..7d3c34f 100644 --- a/src/bin/lttng-sessiond/modprobe.c +++ b/src/bin/lttng-sessiond/modprobe.c @@ -21,6 +21,7 @@ #include <sys/wait.h> #include <common/common.h> +#include <common/utils.h> #include "modprobe.h" #include "kern-modules.h" @@ -49,7 +50,7 @@ const struct kern_modules_param kern_modules_control_opt[] = { }; /* LTTng kernel tracer probe modules list */ -const struct kern_modules_param kern_modules_probes[] = { +struct kern_modules_param kern_modules_probes_default[] = { { "lttng-probe-asoc" }, { "lttng-probe-block" }, { "lttng-probe-btrfs" }, @@ -90,6 +91,10 @@ const struct kern_modules_param kern_modules_probes[] = { { "lttng-probe-writeback" }, }; +/* dynamic probe modules list */ +static struct kern_modules_param *probes; +static int nr_probes; + void modprobe_remove_lttng(const struct kern_modules_param *modules, int entries, int required) { @@ -116,6 +121,8 @@ void modprobe_remove_lttng(const struct kern_modules_param *modules, DBG("Modprobe removal successful %s", modules[i].name); } + if (probes) + free(probes[i].name); } } @@ -125,11 +132,11 @@ void modprobe_remove_lttng(const struct kern_modules_param *modules, void modprobe_remove_lttng_control(void) { modprobe_remove_lttng(kern_modules_control_opt, - ARRAY_SIZE(kern_modules_control_opt), - LTTNG_MOD_OPTIONAL); + 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); + ARRAY_SIZE(kern_modules_control_core), + LTTNG_MOD_REQUIRED); } /* @@ -137,9 +144,14 @@ void modprobe_remove_lttng_control(void) */ void modprobe_remove_lttng_data(void) { - return modprobe_remove_lttng(kern_modules_probes, - ARRAY_SIZE(kern_modules_probes), - LTTNG_MOD_OPTIONAL); + if (probes) { + modprobe_remove_lttng(probes, nr_probes, LTTNG_MOD_OPTIONAL); + free(probes); + probes = NULL; + } else + modprobe_remove_lttng(kern_modules_probes_default, + ARRAY_SIZE(kern_modules_probes_default), + LTTNG_MOD_OPTIONAL); } /* @@ -151,7 +163,7 @@ void modprobe_remove_lttng_all(void) modprobe_remove_lttng_control(); } -static int modprobe_lttng(const struct kern_modules_param *modules, +static int modprobe_lttng(struct kern_modules_param *modules, int entries, int required) { int ret = 0, i; @@ -195,8 +207,8 @@ int modprobe_lttng_control(void) if (ret != 0) return ret; ret = modprobe_lttng(kern_modules_control_opt, - ARRAY_SIZE(kern_modules_control_opt), - LTTNG_MOD_OPTIONAL); + ARRAY_SIZE(kern_modules_control_opt), + LTTNG_MOD_OPTIONAL); return ret; } @@ -205,7 +217,54 @@ int modprobe_lttng_control(void) */ int modprobe_lttng_data(void) { - return modprobe_lttng(kern_modules_probes, - ARRAY_SIZE(kern_modules_probes), - LTTNG_MOD_OPTIONAL); + int entries = ARRAY_SIZE(kern_modules_probes_default); + char *list, *next; + int i; + + /* + * First take command line option, + * if not available take environment variable. + * No idea how the config file option could be provided. + */ + if (kmod_probes_list) + list= kmod_probes_list; + else + list = utils_get_kmod_probes_list(); + + /* the default is to load ALL probes */ + if (!list) + return modprobe_lttng(kern_modules_probes_default, entries, + LTTNG_MOD_OPTIONAL); + + /* + * A probe list is available, so use it. + * The number of probes is limited by the number of probes in the + * default list. + */ + probes = malloc(sizeof(struct kern_modules_param *) * entries); + if (!probes) { + PERROR("malloc probe list"); + return -ENOMEM; + } + for (i = 0; i < entries; i++) { + next = strtok(list, ","); + if (!next) + goto out; + list = NULL; + + /* filter leading spaces */ + while (*next == ' ') + next++; + + /* length 13 is "lttng-probe-" + \0 */ + probes[i].name = malloc(strlen(next) + 13); + if (!probes[i].name) { + PERROR("malloc probe list"); + return -ENOMEM; + } + sprintf(probes[i].name, "lttng-probe-%s", next); + } +out: + nr_probes = i; + return modprobe_lttng(probes, nr_probes, LTTNG_MOD_OPTIONAL); } diff --git a/src/bin/lttng-sessiond/modprobe.h b/src/bin/lttng-sessiond/modprobe.h index 0c6f5f1..42e1912 100644 --- a/src/bin/lttng-sessiond/modprobe.h +++ b/src/bin/lttng-sessiond/modprobe.h @@ -24,4 +24,6 @@ void modprobe_remove_lttng_data(void); int modprobe_lttng_control(void); int modprobe_lttng_data(void); +char *kmod_probes_list; + #endif /* _MODPROBE_H */ diff --git a/src/common/defaults.h b/src/common/defaults.h index de61064..b49bf4b 100644 --- a/src/common/defaults.h +++ b/src/common/defaults.h @@ -90,6 +90,9 @@ #define DEFAULT_LTTNG_SESSIOND_PIDFILE "lttng-sessiond.pid" #define DEFAULT_LTTNG_SESSIOND_JULPORT_FILE "jul.port" +/* Default probes list */ +#define DEFAULT_LTTNG_KMOD_PROBES "LTTNG_KMOD_PROBES" + /* Default unix socket path */ #define DEFAULT_GLOBAL_CLIENT_UNIX_SOCK DEFAULT_LTTNG_RUNDIR "/client-lttng-sessiond" #define DEFAULT_HOME_CLIENT_UNIX_SOCK DEFAULT_LTTNG_HOME_RUNDIR "/client-lttng-sessiond" diff --git a/src/common/utils.c b/src/common/utils.c index 815965b..78f858c 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -870,6 +870,16 @@ end: } /* + * Obtain the value of LTTNG_KMOD_PROBES environment variable, if exists. + * Otherwise returns an empty string. + */ +LTTNG_HIDDEN +char *utils_get_kmod_probes_list(void) +{ + return getenv(DEFAULT_LTTNG_KMOD_PROBES); +} + +/* * With the given format, fill dst with the time of len maximum siz. * * Return amount of bytes set in the buffer or else 0 on error. diff --git a/src/common/utils.h b/src/common/utils.h index b872b53..cc80a53 100644 --- a/src/common/utils.h +++ b/src/common/utils.h @@ -47,6 +47,7 @@ int utils_parse_size_suffix(char const * const str, uint64_t * const size); int utils_get_count_order_u32(uint32_t x); char *utils_get_home_dir(void); char *utils_get_user_home_dir(uid_t uid); +char *utils_get_kmod_probes_list(void); size_t utils_get_current_time_str(const char *format, char *dst, size_t len); gid_t utils_get_group_id(const char *name); char *utils_generate_optstring(const struct option *long_options, -- 1.7.9.5 _______________________________________________ lttng-dev mailing list lttng-dev@lists.lttng.org http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev