X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=lttng-sessiond%2Fmain.c;h=ff8141cfb93feb13e081b9191f46501de353d570;hb=5af3d17607cbce4ab708e633986d3d41f8d56814;hp=f5f8dbe86a3999d4fb10a30e34f0892ea973dd66;hpb=190df5ac47b77841178c8e5b87eb8a5a13ecdb2e;p=lttng-tools.git diff --git a/lttng-sessiond/main.c b/lttng-sessiond/main.c index f5f8dbe86..ff8141cfb 100644 --- a/lttng-sessiond/main.c +++ b/lttng-sessiond/main.c @@ -78,6 +78,8 @@ struct consumer_data { char cmd_unix_sock_path[PATH_MAX]; }; +#include "benchmark.h" + /* Const values */ const char default_home_dir[] = DEFAULT_HOME_DIR; const char default_tracing_group[] = LTTNG_DEFAULT_TRACING_GROUP; @@ -174,14 +176,10 @@ static struct ltt_session_list *session_list_ptr; int ust_consumerd64_fd = -1; int ust_consumerd32_fd = -1; -static const char *consumerd32_bin = - __stringify(CONFIG_CONSUMERD32_BIN); -static const char *consumerd64_bin = - __stringify(CONFIG_CONSUMERD64_BIN); -static const char *consumerd32_libdir = - __stringify(CONFIG_CONSUMERD32_LIBDIR); -static const char *consumerd64_libdir = - __stringify(CONFIG_CONSUMERD64_LIBDIR); +static const char *consumerd32_bin = CONFIG_CONSUMERD32_BIN; +static const char *consumerd64_bin = CONFIG_CONSUMERD64_BIN; +static const char *consumerd32_libdir = CONFIG_CONSUMERD32_LIBDIR; +static const char *consumerd64_libdir = CONFIG_CONSUMERD64_LIBDIR; static void setup_consumerd_path(void) @@ -469,6 +467,25 @@ static void cleanup(void) close(thread_quit_pipe[0]); close(thread_quit_pipe[1]); + /* OUTPUT BENCHMARK RESULTS */ + bench_init(); + + if (getenv("BENCH_UST_NOTIFY")) { + bench_print_ust_notification(); + } + + if (getenv("BENCH_UST_REGISTER")) { + bench_print_ust_register(); + bench_print_ust_unregister(); + } + + if (getenv("BENCH_BOOT_PROCESS")) { + bench_print_boot_process(); + } + + bench_close(); + /* END BENCHMARK */ + /* */ DBG("%c[%d;%dm*** assert failed :-) *** ==> %c[%dm%c[%d;%dm" "Matthew, BEET driven development works!%c[%dm", @@ -651,6 +668,8 @@ static int notify_ust_apps(int active) DBG("Notifying applications of session daemon state: %d", active); + tracepoint(ust_notify_apps_start); + /* See shm.c for this call implying mmap, shm and futex calls */ wait_shm_mmap = shm_ust_get_mmap(wait_shm_path, is_root); if (wait_shm_mmap == NULL) { @@ -660,6 +679,8 @@ static int notify_ust_apps(int active) /* Wake waiting process */ futex_wait_update((int32_t *) wait_shm_mmap, active); + tracepoint(ust_notify_apps_stop); + /* Apps notified successfully */ return 0; @@ -832,6 +853,8 @@ static void *thread_manage_kernel(void *data) char tmp; struct lttng_poll_event events; + tracepoint(sessiond_th_kern_start); + DBG("Thread manage kernel started"); ret = create_thread_poll_set(&events, 2); @@ -866,6 +889,8 @@ static void *thread_manage_kernel(void *data) /* Zeroed the poll events */ lttng_poll_reset(&events); + tracepoint(sessiond_th_kern_poll); + /* Poll infinite value of time */ ret = lttng_poll_wait(&events, -1); if (ret < 0) { @@ -934,6 +959,8 @@ static void *thread_manage_consumer(void *data) struct lttng_poll_event events; struct consumer_data *consumer_data = data; + tracepoint(sessiond_th_kcon_start); + DBG("[thread] Manage consumer started"); ret = lttcomm_listen_unix_sock(consumer_data->err_sock); @@ -957,6 +984,8 @@ static void *thread_manage_consumer(void *data) nb_fd = LTTNG_POLL_GETNB(&events); + tracepoint(sessiond_th_kcon_poll); + /* Inifinite blocking call, waiting for transmission */ ret = lttng_poll_wait(&events, -1); if (ret < 0) { @@ -1089,6 +1118,8 @@ static void *thread_manage_apps(void *data) struct ust_command ust_cmd; struct lttng_poll_event events; + tracepoint(sessiond_th_apps_start); + DBG("[thread] Manage application started"); rcu_register_thread(); @@ -1112,6 +1143,8 @@ static void *thread_manage_apps(void *data) DBG("Apps thread polling on %d fds", nb_fd); + tracepoint(sessiond_th_apps_poll); + /* Inifinite blocking call, waiting for transmission */ ret = lttng_poll_wait(&events, -1); if (ret < 0) { @@ -1135,13 +1168,16 @@ static void *thread_manage_apps(void *data) ERR("Apps command pipe error"); goto error; } else if (revents & LPOLLIN) { + tracepoint(ust_register_read_start); /* Empty pipe */ ret = read(apps_cmd_pipe[0], &ust_cmd, sizeof(ust_cmd)); if (ret < 0 || ret < sizeof(ust_cmd)) { perror("read apps cmd pipe"); goto error; } + tracepoint(ust_register_read_stop); + tracepoint(ust_register_add_start); /* Register applicaton to the session daemon */ ret = ust_app_register(&ust_cmd.reg_msg, ust_cmd.sock); @@ -1150,7 +1186,9 @@ static void *thread_manage_apps(void *data) } else if (ret < 0) { break; } + tracepoint(ust_register_add_stop); + tracepoint(ust_register_done_start); /* * Add channel(s) and event(s) to newly registered apps * from lttng global UST domain. @@ -1177,7 +1215,7 @@ static void *thread_manage_apps(void *data) DBG("Apps with sock %d added to poll set", ust_cmd.sock); } - + tracepoint(ust_register_done_stop); break; } } else { @@ -1186,6 +1224,8 @@ static void *thread_manage_apps(void *data) * the event at poll_wait. */ if (revents & (LPOLLERR | LPOLLHUP | LPOLLRDHUP)) { + tracepoint(ust_unregister_start); + /* Removing from the poll set */ ret = lttng_poll_del(&events, pollfd); if (ret < 0) { @@ -1194,6 +1234,8 @@ static void *thread_manage_apps(void *data) /* Socket closed on remote end. */ ust_app_unregister(pollfd); + + tracepoint(ust_unregister_stop); break; } } @@ -1222,6 +1264,8 @@ static void *thread_dispatch_ust_registration(void *data) struct cds_wfq_node *node; struct ust_command *ust_cmd = NULL; + tracepoint(sessiond_th_dispatch_start); + DBG("[thread] Dispatch UST command started"); while (!dispatch_thread_exit) { @@ -1229,6 +1273,8 @@ static void *thread_dispatch_ust_registration(void *data) futex_nto1_prepare(&ust_cmd_queue.futex); do { + tracepoint(sessiond_th_dispatch_block); + /* Dequeue command for registration */ node = cds_wfq_dequeue_blocking(&ust_cmd_queue.queue); if (node == NULL) { @@ -1237,6 +1283,8 @@ static void *thread_dispatch_ust_registration(void *data) break; } + tracepoint(ust_dispatch_register_start); + ust_cmd = caa_container_of(node, struct ust_command, node); DBG("Dispatching UST registration pid:%d ppid:%d uid:%d" @@ -1267,6 +1315,8 @@ static void *thread_dispatch_ust_registration(void *data) free(ust_cmd); } while (node != NULL); + tracepoint(ust_dispatch_register_stop); + /* Futex wait on queue. Blocking call on futex() */ futex_nto1_wait(&ust_cmd_queue.futex); } @@ -1290,6 +1340,8 @@ static void *thread_registration_apps(void *data) */ struct ust_command *ust_cmd = NULL; + tracepoint(sessiond_th_reg_start); + DBG("[thread] Manage application registration started"); ret = lttcomm_listen_unix_sock(apps_sock); @@ -1323,6 +1375,8 @@ static void *thread_registration_apps(void *data) while (1) { DBG("Accepting application registration"); + tracepoint(sessiond_th_reg_poll); + nb_fd = LTTNG_POLL_GETNB(&events); /* Inifinite blocking call, waiting for transmission */ @@ -1348,6 +1402,9 @@ static void *thread_registration_apps(void *data) ERR("Register apps socket poll error"); goto error; } else if (revents & LPOLLIN) { + /* Registration starts here. Recording cycles */ + tracepoint(ust_register_start); + sock = lttcomm_accept_unix_sock(apps_sock); if (sock < 0) { goto error; @@ -1397,6 +1454,8 @@ static void *thread_registration_apps(void *data) * barrier with the exchange in cds_wfq_enqueue. */ futex_nto1_wake(&ust_cmd_queue.futex); + + tracepoint(ust_register_stop); } } } @@ -1540,13 +1599,21 @@ static pid_t spawn_consumerd(struct consumer_data *consumer_data) * sessiond's installation directory, and * fallback on the 32-bit one, */ + DBG3("Looking for a kernel consumer at these locations:"); + DBG3(" 1) %s", consumerd64_bin); + DBG3(" 2) %s/%s", INSTALL_BIN_PATH, CONSUMERD_FILE); + DBG3(" 3) %s", consumerd32_bin); if (stat(consumerd64_bin, &st) == 0) { + DBG3("Found location #1"); consumer_to_use = consumerd64_bin; } else if (stat(INSTALL_BIN_PATH "/" CONSUMERD_FILE, &st) == 0) { + DBG3("Found location #2"); consumer_to_use = INSTALL_BIN_PATH "/" CONSUMERD_FILE; } else if (stat(consumerd32_bin, &st) == 0) { + DBG3("Found location #3"); consumer_to_use = consumerd32_bin; } else { + DBG("Could not find any valid consumerd executable"); break; } DBG("Using kernel consumer at: %s", consumer_to_use); @@ -3465,14 +3532,18 @@ static int process_client_msg(struct command_ctx *cmd_ctx) } case LTTNG_CREATE_SESSION: { + tracepoint(create_session_start); ret = cmd_create_session(cmd_ctx->lsm->session.name, cmd_ctx->lsm->session.path, &cmd_ctx->creds); + tracepoint(create_session_end); break; } case LTTNG_DESTROY_SESSION: { + tracepoint(destroy_session_start); ret = cmd_destroy_session(cmd_ctx->session, cmd_ctx->lsm->session.name); + tracepoint(destroy_session_end); break; } case LTTNG_LIST_DOMAINS: @@ -3623,6 +3694,8 @@ static void *thread_manage_clients(void *data) struct command_ctx *cmd_ctx = NULL; struct lttng_poll_event events; + tracepoint(sessiond_th_cli_start); + DBG("[thread] Manage client started"); rcu_register_thread(); @@ -3657,6 +3730,8 @@ static void *thread_manage_clients(void *data) while (1) { DBG("Accepting client command ..."); + tracepoint(sessiond_th_cli_poll); + nb_fd = LTTNG_POLL_GETNB(&events); /* Inifinite blocking call, waiting for transmission */ @@ -4247,6 +4322,7 @@ int main(int argc, char **argv) void *status; const char *home_path; + tracepoint(sessiond_boot_start); rcu_register_thread(); /* Create thread quit pipe */ @@ -4506,6 +4582,8 @@ int main(int argc, char **argv) goto exit_kernel; } + tracepoint(sessiond_boot_end); + ret = pthread_join(kernel_thread, &status); if (ret != 0) { perror("pthread_join");