#include "event.h"
#include "futex.h"
#include "kernel.h"
+#include "modprobe.h"
#include "shm.h"
#include "ust-ctl.h"
#include "utils.h"
/* Const values */
const char default_home_dir[] = DEFAULT_HOME_DIR;
-const char default_tracing_group[] = LTTNG_DEFAULT_TRACING_GROUP;
+const char default_tracing_group[] = DEFAULT_TRACING_GROUP;
const char default_ust_sock_dir[] = DEFAULT_UST_SOCK_DIR;
const char default_global_apps_pipe[] = DEFAULT_GLOBAL_APPS_PIPE;
if (bin) {
consumerd64_bin = bin;
}
- libdir = getenv("LTTNG_TOOLS_CONSUMERD32_LIBDIR");
+ libdir = getenv("LTTNG_CONSUMERD32_LIBDIR");
if (libdir) {
consumerd32_libdir = libdir;
}
- libdir = getenv("LTTNG_TOOLS_CONSUMERD64_LIBDIR");
+ libdir = getenv("LTTNG_CONSUMERD64_LIBDIR");
if (libdir) {
consumerd64_libdir = libdir;
}
return 0;
}
-/*
- * Remove modules in reverse load order.
- */
-static int modprobe_remove_kernel_modules(void)
-{
- int ret = 0, i;
- char modprobe[256];
-
- for (i = ARRAY_SIZE(kernel_modules_list) - 1; i >= 0; i--) {
- ret = snprintf(modprobe, sizeof(modprobe),
- "/sbin/modprobe -r -q %s",
- kernel_modules_list[i].name);
- if (ret < 0) {
- perror("snprintf modprobe -r");
- goto error;
- }
- modprobe[sizeof(modprobe) - 1] = '\0';
- ret = system(modprobe);
- if (ret == -1) {
- ERR("Unable to launch modprobe -r for module %s",
- kernel_modules_list[i].name);
- } else if (kernel_modules_list[i].required
- && WEXITSTATUS(ret) != 0) {
- ERR("Unable to remove module %s",
- kernel_modules_list[i].name);
- } else {
- DBG("Modprobe removal successful %s",
- kernel_modules_list[i].name);
- }
- }
-
-error:
- return ret;
-}
-
/*
* Return group ID of the tracing group or -1 if not found.
*/
DBG2("Closing kernel fd");
close(kernel_tracer_fd);
DBG("Unloading kernel modules");
- modprobe_remove_kernel_modules();
+ modprobe_remove_lttng_all();
}
close(thread_quit_pipe[0]);
}
/*
- * Add channel(s) and event(s) to newly registered apps
- * from lttng global UST domain.
+ * Validate UST version compatibility.
*/
- update_ust_app(ust_cmd.sock);
+ ret = ust_app_validate_version(ust_cmd.sock);
+ if (ret >= 0) {
+ /*
+ * Add channel(s) and event(s) to newly registered apps
+ * from lttng global UST domain.
+ */
+ update_ust_app(ust_cmd.sock);
+ }
ret = ust_app_register_done(ust_cmd.sock);
if (ret < 0) {
}
/*
- * modprobe_kernel_modules
+ * Check version of the lttng-modules.
*/
-static int modprobe_kernel_modules(void)
+static int validate_lttng_modules_version(void)
{
- int ret = 0, i;
- char modprobe[256];
-
- for (i = 0; i < ARRAY_SIZE(kernel_modules_list); i++) {
- ret = snprintf(modprobe, sizeof(modprobe),
- "/sbin/modprobe %s%s",
- kernel_modules_list[i].required ? "" : "-q ",
- kernel_modules_list[i].name);
- if (ret < 0) {
- perror("snprintf modprobe");
- goto error;
- }
- modprobe[sizeof(modprobe) - 1] = '\0';
- ret = system(modprobe);
- if (ret == -1) {
- ERR("Unable to launch modprobe for module %s",
- kernel_modules_list[i].name);
- } else if (kernel_modules_list[i].required
- && WEXITSTATUS(ret) != 0) {
- ERR("Unable to load module %s",
- kernel_modules_list[i].name);
- } else {
- DBG("Modprobe successfully %s",
- kernel_modules_list[i].name);
- }
- }
-
-error:
- return ret;
+ return kernel_validate_version(kernel_tracer_fd);
}
/*
- * mount_debugfs
+ * Setup necessary data for kernel tracer action.
*/
-static int mount_debugfs(char *path)
+static int init_kernel_tracer(void)
{
int ret;
- char *type = "debugfs";
- ret = run_as_mkdir_recursive(path, S_IRWXU | S_IRWXG, geteuid(), getegid());
- if (ret < 0) {
- PERROR("Cannot create debugfs path");
- goto error;
- }
-
- ret = mount(type, path, type, 0, NULL);
+ /* Modprobe lttng kernel modules */
+ ret = modprobe_lttng_control();
if (ret < 0) {
- PERROR("Cannot mount debugfs");
goto error;
}
- DBG("Mounted debugfs successfully at %s", path);
-
-error:
- return ret;
-}
-
-/*
- * Setup necessary data for kernel tracer action.
- */
-static void init_kernel_tracer(void)
-{
- int ret;
- char *proc_mounts = "/proc/mounts";
- char line[256];
- char *debugfs_path = NULL, *lttng_path = NULL;
- FILE *fp;
-
- /* Detect debugfs */
- fp = fopen(proc_mounts, "r");
- if (fp == NULL) {
- ERR("Unable to probe %s", proc_mounts);
- goto error;
- }
-
- while (fgets(line, sizeof(line), fp) != NULL) {
- if (strstr(line, "debugfs") != NULL) {
- /* Remove first string */
- strtok(line, " ");
- /* Dup string here so we can reuse line later on */
- debugfs_path = strdup(strtok(NULL, " "));
- DBG("Got debugfs path : %s", debugfs_path);
- break;
- }
- }
-
- fclose(fp);
-
- /* Mount debugfs if needded */
- if (debugfs_path == NULL) {
- ret = asprintf(&debugfs_path, "/mnt/debugfs");
- if (ret < 0) {
- perror("asprintf debugfs path");
- goto error;
- }
- ret = mount_debugfs(debugfs_path);
- if (ret < 0) {
- perror("Cannot mount debugfs");
- goto error;
- }
+ /* Open debugfs lttng */
+ kernel_tracer_fd = open(module_proc_lttng, O_RDWR);
+ if (kernel_tracer_fd < 0) {
+ DBG("Failed to open %s", module_proc_lttng);
+ ret = -1;
+ goto error_open;
}
- /* Modprobe lttng kernel modules */
- ret = modprobe_kernel_modules();
+ /* Validate kernel version */
+ ret = validate_lttng_modules_version();
if (ret < 0) {
- goto error;
+ goto error_version;
}
- /* Setup lttng kernel path */
- ret = asprintf(<tng_path, "%s/lttng", debugfs_path);
+ ret = modprobe_lttng_data();
if (ret < 0) {
- perror("asprintf lttng path");
- goto error;
- }
-
- /* Open debugfs lttng */
- kernel_tracer_fd = open(lttng_path, O_RDWR);
- if (kernel_tracer_fd < 0) {
- DBG("Failed to open %s", lttng_path);
- goto error;
+ goto error_modules;
}
- free(lttng_path);
- free(debugfs_path);
DBG("Kernel tracer fd %d", kernel_tracer_fd);
- return;
+ return 0;
+
+error_version:
+ modprobe_remove_lttng_control();
+ close(kernel_tracer_fd);
+ kernel_tracer_fd = 0;
+ return LTTCOMM_KERN_VERSION;
+
+error_modules:
+ close(kernel_tracer_fd);
+
+error_open:
+ modprobe_remove_lttng_control();
error:
- if (lttng_path) {
- free(lttng_path);
- }
- if (debugfs_path) {
- free(debugfs_path);
- }
WARN("No kernel tracer available");
kernel_tracer_fd = 0;
- return;
+ return LTTCOMM_KERN_NA;
}
/*
}
break;
}
+#if 0
case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN:
case LTTNG_DOMAIN_UST_EXEC_NAME:
case LTTNG_DOMAIN_UST_PID:
- ret = LTTCOMM_NOT_IMPLEMENTED;
- goto error;
+#endif
default:
ret = LTTCOMM_UNKNOWN_DOMAIN;
goto error;
}
break;
}
+#if 0
case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN:
case LTTNG_DOMAIN_UST_EXEC_NAME:
case LTTNG_DOMAIN_UST_PID:
- ret = LTTCOMM_NOT_IMPLEMENTED;
- goto error;
+#endif
default:
ret = LTTCOMM_UNKNOWN_DOMAIN;
goto error;
channel_name);
break;
}
+#if 0
case LTTNG_DOMAIN_UST_EXEC_NAME:
case LTTNG_DOMAIN_UST_PID:
case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN:
+#endif
default:
- ret = LTTCOMM_NOT_IMPLEMENTED;
+ ret = LTTCOMM_UND;
goto error;
}
break;
}
+#if 0
case LTTNG_DOMAIN_UST_EXEC_NAME:
case LTTNG_DOMAIN_UST_PID:
case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN:
+#endif
default:
- ret = LTTCOMM_NOT_IMPLEMENTED;
+ ret = LTTCOMM_UND;
goto error;
}
}
break;
}
+#if 0
case LTTNG_DOMAIN_UST_EXEC_NAME:
case LTTNG_DOMAIN_UST_PID:
case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN:
+#endif
default:
- ret = LTTCOMM_NOT_IMPLEMENTED;
+ ret = LTTCOMM_UND;
goto error;
}
}
break;
}
+#if 0
case LTTNG_DOMAIN_UST_EXEC_NAME:
case LTTNG_DOMAIN_UST_PID:
case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN:
+#endif
default:
- ret = LTTCOMM_NOT_IMPLEMENTED;
+ ret = LTTCOMM_UND;
goto error;
}
break;
}
+#if 0
case LTTNG_DOMAIN_UST_EXEC_NAME:
case LTTNG_DOMAIN_UST_PID:
case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN:
+#endif
default:
- ret = LTTCOMM_NOT_IMPLEMENTED;
+ ret = LTTCOMM_UND;
goto error;
}
}
break;
default:
- ret = LTTCOMM_NOT_IMPLEMENTED;
+ ret = LTTCOMM_UND;
goto error;
}
}
break;
}
+ case LTTNG_DOMAIN_UST:
+ {
+ struct lttng_ust_calibrate ucalibrate;
+
+ ucalibrate.type = calibrate->type;
+ ret = ust_app_calibrate_glb(&ucalibrate);
+ if (ret < 0) {
+ ret = LTTCOMM_UST_CALIBRATE_FAIL;
+ goto error;
+ }
+ break;
+ }
default:
- /* TODO: Userspace tracing */
- ret = LTTCOMM_NOT_IMPLEMENTED;
+ ret = LTTCOMM_UND;
goto error;
}
break;
default:
/* TODO: Userspace tracing */
- ret = LTTCOMM_NOT_IMPLEMENTED;
+ ret = LTTCOMM_UND;
goto error;
}
break;
default:
*channels = NULL;
- ret = -LTTCOMM_NOT_IMPLEMENTED;
+ ret = -LTTCOMM_UND;
goto error;
}
break;
}
default:
- ret = -LTTCOMM_NOT_IMPLEMENTED;
+ ret = -LTTCOMM_UND;
goto error;
}
/* Kernel tracer check */
if (kernel_tracer_fd == 0) {
/* Basically, load kernel tracer modules */
- init_kernel_tracer();
- if (kernel_tracer_fd == 0) {
- ret = LTTCOMM_KERN_NA;
+ ret = init_kernel_tracer();
+ if (ret != 0) {
goto error;
}
}
* Notify parent pid that we are ready to accept command for client side.
*/
if (opt_sig_parent) {
- kill(ppid, SIGCHLD);
+ kill(ppid, SIGUSR1);
}
while (1) {