X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fmain.c;h=5f99bdbf63b66c01bb70d54a9839170b0e67d487;hp=7f66a7271222d16b11dbb501ddf7dd5c0e291fb2;hb=7d268848fe44e591c53c8dfce796c6503c4539e8;hpb=0d64e8fbee878b0de2c0bbe819d5e40790112a01 diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c index 7f66a7271..5f99bdbf6 100644 --- a/src/bin/lttng-sessiond/main.c +++ b/src/bin/lttng-sessiond/main.c @@ -61,7 +61,6 @@ #include "event.h" #include "kernel.h" #include "kernel-consumer.h" -#include "modprobe.h" #include "shm.h" #include "ust-ctl.h" #include "ust-consumer.h" @@ -75,7 +74,6 @@ #include "notification-thread.h" #include "notification-thread-commands.h" #include "rotation-thread.h" -#include "lttng-syscall.h" #include "agent.h" #include "ht-cleanup.h" #include "sessiond-config.h" @@ -155,8 +153,6 @@ static int apps_cmd_notify_pipe[2] = { -1, -1 }; */ static struct ust_cmd_queue ust_cmd_queue; -static const char *module_proc_lttng = "/proc/lttng"; - /* * Section name to look for in the daemon configuration file. */ @@ -327,32 +323,22 @@ static void sessiond_cleanup(void) pthread_mutex_destroy(&session_list->lock); - wait_consumer(&kconsumer_data); - wait_consumer(&ustconsumer64_data); - wait_consumer(&ustconsumer32_data); - DBG("Cleaning up all agent apps"); agent_app_ht_clean(); - DBG("Closing all UST sockets"); ust_app_clean_list(); buffer_reg_destroy_registries(); + close_consumer_sockets(); + + wait_consumer(&kconsumer_data); + wait_consumer(&ustconsumer64_data); + wait_consumer(&ustconsumer32_data); + if (is_root && !config.no_kernel) { - DBG2("Closing kernel fd"); - if (kernel_tracer_fd >= 0) { - ret = close(kernel_tracer_fd); - if (ret) { - PERROR("close"); - } - } - DBG("Unloading kernel modules"); - modprobe_remove_lttng_all(); - free(syscall_table); + cleanup_kernel_tracer(); } - close_consumer_sockets(); - /* * We do NOT rmdir rundir because there are other processes * using it, for instance lttng-relayd, which can start in @@ -372,81 +358,6 @@ static void sessiond_cleanup_options(void) run_as_destroy_worker(); } -/* - * Setup necessary data for kernel tracer action. - */ -static int init_kernel_tracer(void) -{ - int ret; - - /* Modprobe lttng kernel modules */ - ret = modprobe_lttng_control(); - if (ret < 0) { - 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); - goto error_open; - } - - /* Validate kernel version */ - ret = kernel_validate_version(kernel_tracer_fd, &kernel_tracer_version, - &kernel_tracer_abi_version); - if (ret < 0) { - goto error_version; - } - - ret = modprobe_lttng_data(); - if (ret < 0) { - goto error_modules; - } - - ret = kernel_supports_ring_buffer_snapshot_sample_positions( - kernel_tracer_fd); - if (ret < 0) { - goto error_modules; - } - - if (ret < 1) { - WARN("Kernel tracer does not support buffer monitoring. " - "The monitoring timer of channels in the kernel domain " - "will be set to 0 (disabled)."); - } - - DBG("Kernel tracer fd %d", kernel_tracer_fd); - return 0; - -error_version: - modprobe_remove_lttng_control(); - ret = close(kernel_tracer_fd); - if (ret) { - PERROR("close"); - } - kernel_tracer_fd = -1; - return LTTNG_ERR_KERN_VERSION; - -error_modules: - ret = close(kernel_tracer_fd); - if (ret) { - PERROR("close"); - } - -error_open: - modprobe_remove_lttng_control(); - -error: - WARN("No kernel tracer available"); - kernel_tracer_fd = -1; - if (!is_root) { - return LTTNG_ERR_NEED_ROOT_SESSIOND; - } else { - return LTTNG_ERR_KERN_NA; - } -} - static int string_match(const char *str1, const char *str2) { return (str1 && str2) && !strcmp(str1, str2); @@ -1023,7 +934,11 @@ static int set_permissions(char *rundir) int ret; gid_t gid; - gid = utils_get_group_id(config.tracing_group_name.value); + ret = utils_get_group_id(config.tracing_group_name.value, true, &gid); + if (ret) { + /* Default to root group. */ + gid = 0; + } /* Set lttng run dir */ ret = chown(rundir, 0, gid); @@ -1134,7 +1049,16 @@ static int set_consumer_sockets(struct consumer_data *consumer_data) goto error; } if (is_root) { - ret = chown(path, 0, utils_get_group_id(config.tracing_group_name.value)); + gid_t gid; + + ret = utils_get_group_id(config.tracing_group_name.value, true, + &gid); + if (ret) { + /* Default to root group. */ + gid = 0; + } + + ret = chown(path, 0, gid); if (ret < 0) { ERR("Unable to set group on %s", path); PERROR("chown"); @@ -1322,8 +1246,8 @@ static void destroy_all_sessions_and_wait(void) goto unlock_session; } (void) cmd_stop_trace(session); - (void) cmd_destroy_session(session, - notification_thread_handle); + (void) cmd_destroy_session(session, notification_thread_handle, + NULL); unlock_session: session_unlock(session); session_put(session); @@ -1336,6 +1260,34 @@ static void destroy_all_sessions_and_wait(void) DBG("Destruction of all sessions completed"); } +static int run_as_worker_post_fork_cleanup(void *data) +{ + struct sessiond_config *sessiond_config = data; + + sessiond_config_fini(sessiond_config); + return 0; +} + +static int launch_run_as_worker(const char *procname) +{ + /* + * Clean-up before forking the run-as worker. Any dynamically + * allocated memory of which the worker is not aware will + * be leaked as the process forks a run-as worker (and performs + * no exec*()). The same would apply to any opened fd. + */ + return run_as_create_worker(procname, run_as_worker_post_fork_cleanup, + &config); +} + +static void sessiond_uuid_log(void) +{ + char uuid_str[UUID_STR_LEN]; + + lttng_uuid_to_str(sessiond_uuid, uuid_str); + DBG("Starting lttng-sessiond {%s}", uuid_str); +} + /* * main */ @@ -1432,6 +1384,7 @@ int main(int argc, char **argv) set_clock_plugin_env(); sessiond_config_log(&config); + sessiond_uuid_log(); if (create_lttng_rundir()) { retval = -1; @@ -1469,7 +1422,7 @@ int main(int argc, char **argv) } } - if (run_as_create_worker(argv[0]) < 0) { + if (launch_run_as_worker(argv[0]) < 0) { goto exit_create_run_as_worker_cleanup; } @@ -1600,14 +1553,6 @@ int main(int argc, char **argv) /* Setup kernel tracer */ if (!config.no_kernel) { init_kernel_tracer(); - if (kernel_tracer_fd >= 0) { - ret = syscall_init_table(); - if (ret < 0) { - ERR("Unable to populate syscall table. " - "Syscall tracing won't work " - "for this session daemon."); - } - } } /* Set ulimit for open files */ @@ -1626,12 +1571,6 @@ int main(int argc, char **argv) goto stop_threads; } - /* Set credentials to socket */ - if (is_root && set_permissions(config.rundir.value)) { - retval = -1; - goto stop_threads; - } - /* Get parent pid if -S, --sig-parent is specified. */ if (config.sig_parent) { ppid = getppid(); @@ -1741,6 +1680,12 @@ int main(int argc, char **argv) goto stop_threads; } + /* Set credentials of the client socket and rundir */ + if (is_root && set_permissions(config.rundir.value)) { + retval = -1; + goto stop_threads; + } + if (!launch_ust_dispatch_thread(&ust_cmd_queue, apps_cmd_pipe[1], apps_cmd_notify_pipe[1])) { retval = -1; @@ -1800,7 +1745,7 @@ int main(int argc, char **argv) */ /* Initiate teardown once activity occurs on the quit pipe. */ - sessiond_wait_for_quit_pipe(-1U); + sessiond_wait_for_quit_pipe(-1); stop_threads: /*