Merge branch 'master' into benchmark
authorDavid Goulet <dgoulet@efficios.com>
Thu, 8 Mar 2012 23:13:18 +0000 (18:13 -0500)
committerDavid Goulet <dgoulet@efficios.com>
Thu, 8 Mar 2012 23:13:18 +0000 (18:13 -0500)
1  2 
configure.ac
src/bin/lttng-sessiond/main.c
src/bin/lttng-sessiond/shm.c

diff --combined configure.ac
index 322d9f21e17df45608054eda6ae04f4f9b244679,a0f0bad1619f7b08640afada7bf4e74050f4c5fb..4bfff84bab4c99fb01e4fb4219d85fc714c9707d
@@@ -1,4 -1,4 +1,4 @@@
- AC_INIT([lttng-tools],[2.0.0-rc1],[dgoulet@efficios.com],[],[http://lttng.org])
+ AC_INIT([lttng-tools],[2.0.0-rc2],[dgoulet@efficios.com],[],[http://lttng.org])
  AC_CONFIG_AUX_DIR([config])
  AC_CANONICAL_TARGET
  AC_CANONICAL_HOST
@@@ -75,11 -75,6 +75,11 @@@ AC_CHECK_LIB([popt], [poptGetContext], 
        [AC_MSG_ERROR([Cannot find libpopt. Use [LDFLAGS]=-Ldir to specify its location.])]
  )
  
 +# Needed for benchmark time
 +AC_CHECK_DECL([caa_get_cycles], [],
 +      [AC_MSG_ERROR([liburcu liburcu_version or newer is needed])], [[#include <urcu/arch.h>]]
 +)
 +
  # URCU library version needed or newer
  liburcu_version=">= 0.6.7"
  
@@@ -121,6 -116,24 +121,24 @@@ AM_CONDITIONAL([HAVE_LIBLTTNG_UST_CTL]
  
  AC_CHECK_FUNCS([sched_getcpu sysconf])
  
+ # check for dlopen
+ AC_CHECK_LIB([dl], [dlopen],
+ [
+       have_libdl=yes
+ ],
+ [
+       #libdl not found, check for dlopen in libc.
+       AC_CHECK_LIB([c], [dlopen],
+       [
+               have_libc_dl=yes
+       ],
+       [
+               AC_MSG_ERROR([Cannot find dlopen in libdl nor libc. Use [LDFLAGS]=-Ldir to specify their location.])
+       ])
+ ])
+ AM_CONDITIONAL([LTTNG_TOOLS_BUILD_WITH_LIBDL], [test "x$have_libdl" = "xyes"])
+ AM_CONDITIONAL([LTTNG_TOOLS_BUILD_WITH_LIBC_DL], [test "x$have_libc_dl" = "xyes"])
  # Option to only build the consumer daemon and its libraries
  AC_ARG_WITH([consumerd-only],
        AS_HELP_STRING([--with-consumerd-only],[Only build the consumer daemon [default=no]]),
@@@ -157,7 -170,6 +175,7 @@@ AC_CONFIG_FILES(
        doc/Makefile
        doc/man/Makefile
        include/Makefile
 +      benchmark/Makefile
        src/Makefile
        src/common/Makefile
        src/common/kernel-ctl/Makefile
index 09353374e0be885e2d9775f265025bc7401ca9d0,6c7ed1fd6e7839926c65e58f28fbfc526bef48f0..e341233ff0ae6cee85e04f85788716ef476779b2
@@@ -17,7 -17,6 +17,6 @@@
   */
  
  #define _GNU_SOURCE
- #include <fcntl.h>
  #include <getopt.h>
  #include <grp.h>
  #include <limits.h>
@@@ -40,6 -39,7 +39,7 @@@
  
  #include <common/common.h>
  #include <common/compat/poll.h>
+ #include <common/compat/socket.h>
  #include <common/defaults.h>
  #include <common/kernel-consumer/kernel-consumer.h>
  #include <common/ust-consumer/ust-consumer.h>
@@@ -75,22 -75,16 +75,18 @@@ 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[] = DEFAULT_TRACING_GROUP;
  const char default_ust_sock_dir[] = DEFAULT_UST_SOCK_DIR;
  const char default_global_apps_pipe[] = DEFAULT_GLOBAL_APPS_PIPE;
  
- /* Variables */
- int opt_verbose;    /* Not static for lttngerr.h */
- int opt_verbose_consumer;    /* Not static for lttngerr.h */
- int opt_quiet;      /* Not static for lttngerr.h */
  const char *progname;
  const char *opt_tracing_group;
  static int opt_sig_parent;
+ static int opt_verbose_consumer;
  static int opt_daemon;
  static int opt_no_kernel;
  static int is_root;                   /* Set to 1 if the daemon is running as root */
@@@ -102,16 -96,22 +98,22 @@@ static struct consumer_data kconsumer_d
        .type = LTTNG_CONSUMER_KERNEL,
        .err_unix_sock_path = DEFAULT_KCONSUMERD_ERR_SOCK_PATH,
        .cmd_unix_sock_path = DEFAULT_KCONSUMERD_CMD_SOCK_PATH,
+       .err_sock = -1,
+       .cmd_sock = -1,
  };
  static struct consumer_data ustconsumer64_data = {
        .type = LTTNG_CONSUMER64_UST,
        .err_unix_sock_path = DEFAULT_USTCONSUMERD64_ERR_SOCK_PATH,
        .cmd_unix_sock_path = DEFAULT_USTCONSUMERD64_CMD_SOCK_PATH,
+       .err_sock = -1,
+       .cmd_sock = -1,
  };
  static struct consumer_data ustconsumer32_data = {
        .type = LTTNG_CONSUMER32_UST,
        .err_unix_sock_path = DEFAULT_USTCONSUMERD32_ERR_SOCK_PATH,
        .cmd_unix_sock_path = DEFAULT_USTCONSUMERD32_CMD_SOCK_PATH,
+       .err_sock = -1,
+       .cmd_sock = -1,
  };
  
  static int dispatch_thread_exit;
@@@ -124,22 -124,22 +126,22 @@@ static char client_unix_sock_path[PATH_
  static char wait_shm_path[PATH_MAX];
  
  /* Sockets and FDs */
- static int client_sock;
- static int apps_sock;
- static int kernel_tracer_fd;
- static int kernel_poll_pipe[2];
+ static int client_sock = -1;
+ static int apps_sock = -1;
+ static int kernel_tracer_fd = -1;
+ static int kernel_poll_pipe[2] = { -1, -1 };
  
  /*
   * Quit pipe for all threads. This permits a single cancellation point
   * for all threads when receiving an event on the pipe.
   */
- static int thread_quit_pipe[2];
+ static int thread_quit_pipe[2] = { -1, -1 };
  
  /*
   * This pipe is used to inform the thread managing application communication
   * that a command is queued and ready to be processed.
   */
- static int apps_cmd_pipe[2];
+ static int apps_cmd_pipe[2] = { -1, -1 };
  
  /* Pthread, Mutexes and Semaphores */
  static pthread_t apps_thread;
@@@ -297,14 -297,22 +299,22 @@@ static gid_t allowed_group(void
   */
  static int init_thread_quit_pipe(void)
  {
-       int ret;
+       int ret, i;
  
-       ret = pipe2(thread_quit_pipe, O_CLOEXEC);
+       ret = pipe(thread_quit_pipe);
        if (ret < 0) {
-               perror("thread quit pipe");
+               PERROR("thread quit pipe");
                goto error;
        }
  
+       for (i = 0; i < 2; i++) {
+               ret = fcntl(thread_quit_pipe[i], F_SETFD, FD_CLOEXEC);
+               if (ret < 0) {
+                       PERROR("fcntl");
+                       goto error;
+               }
+       }
  error:
        return ret;
  }
@@@ -326,7 -334,8 +336,8 @@@ static void teardown_kernel_session(str
         * If a custom kernel consumer was registered, close the socket before
         * tearing down the complete kernel session structure
         */
-       if (session->kernel_session->consumer_fd != kconsumer_data.cmd_sock) {
+       if (kconsumer_data.cmd_sock >= 0 &&
+                       session->kernel_session->consumer_fd != kconsumer_data.cmd_sock) {
                lttcomm_close_unix_sock(session->kernel_session->consumer_fd);
        }
  
@@@ -380,7 -389,7 +391,7 @@@ static void stop_threads(void
   */
  static void cleanup(void)
  {
-       int ret;
+       int ret, i;
        char *cmd;
        struct ltt_session *sess, *stmp;
  
  
        if (is_root && !opt_no_kernel) {
                DBG2("Closing kernel fd");
-               close(kernel_tracer_fd);
+               if (kernel_tracer_fd >= 0) {
+                       ret = close(kernel_tracer_fd);
+                       if (ret) {
+                               PERROR("close");
+                       }
+               }
                DBG("Unloading kernel modules");
                modprobe_remove_lttng_all();
        }
  
-       close(thread_quit_pipe[0]);
-       close(thread_quit_pipe[1]);
+       /*
+        * Closing all pipes used for communication between threads.
+        */
+       for (i = 0; i < 2; i++) {
+               if (kernel_poll_pipe[i] >= 0) {
+                       ret = close(kernel_poll_pipe[i]);
+                       if (ret) {
+                               PERROR("close");
+                       }
+                       
+               }
+       }
+       for (i = 0; i < 2; i++) {
+               if (thread_quit_pipe[i] >= 0) {
+                       ret = close(thread_quit_pipe[i]);
+                       if (ret) {
+                               PERROR("close");
+                       }
+               }
+       }
+       for (i = 0; i < 2; i++) {
+               if (apps_cmd_pipe[i] >= 0) {
+                       ret = close(apps_cmd_pipe[i]);
+                       if (ret) {
+                               PERROR("close");
+                       }
+               }
+       }
  
 +      /* 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 */
 +
        /* <fun> */
        DBG("%c[%d;%dm*** assert failed :-) *** ==> %c[%dm%c[%d;%dm"
                        "Matthew, BEET driven development works!%c[%dm",
@@@ -510,7 -531,7 +552,7 @@@ static int send_kconsumer_channel_strea
        DBG("Sending channel %d to consumer", lkm.u.channel.channel_key);
        ret = lttcomm_send_unix_sock(sock, &lkm, sizeof(lkm));
        if (ret < 0) {
-               perror("send consumer channel");
+               PERROR("send consumer channel");
                goto error;
        }
  
                DBG("Sending stream %d to consumer", lkm.u.stream.stream_key);
                ret = lttcomm_send_unix_sock(sock, &lkm, sizeof(lkm));
                if (ret < 0) {
-                       perror("send consumer stream");
+                       PERROR("send consumer stream");
                        goto error;
                }
                ret = lttcomm_send_fds_unix_sock(sock, &stream->fd, 1);
                if (ret < 0) {
-                       perror("send consumer stream ancillary data");
+                       PERROR("send consumer stream ancillary data");
                        goto error;
                }
        }
@@@ -563,12 -584,12 +605,12 @@@ static int send_kconsumer_session_strea
  
        DBG("Sending metadata stream fd");
  
-       /* Extra protection. It's NOT supposed to be set to 0 at this point */
-       if (session->consumer_fd == 0) {
+       /* Extra protection. It's NOT supposed to be set to -1 at this point */
+       if (session->consumer_fd < 0) {
                session->consumer_fd = consumer_data->cmd_sock;
        }
  
-       if (session->metadata_stream_fd != 0) {
+       if (session->metadata_stream_fd >= 0) {
                /* Send metadata channel fd */
                lkm.cmd_type = LTTNG_CONSUMER_ADD_CHANNEL;
                lkm.u.channel.channel_key = session->metadata->fd;
                DBG("Sending metadata channel %d to consumer", lkm.u.stream.stream_key);
                ret = lttcomm_send_unix_sock(sock, &lkm, sizeof(lkm));
                if (ret < 0) {
-                       perror("send consumer channel");
+                       PERROR("send consumer channel");
                        goto error;
                }
  
                DBG("Sending metadata stream %d to consumer", lkm.u.stream.stream_key);
                ret = lttcomm_send_unix_sock(sock, &lkm, sizeof(lkm));
                if (ret < 0) {
-                       perror("send consumer stream");
+                       PERROR("send consumer stream");
                        goto error;
                }
                ret = lttcomm_send_fds_unix_sock(sock, &session->metadata_stream_fd, 1);
                if (ret < 0) {
-                       perror("send consumer stream");
+                       PERROR("send consumer stream");
                        goto error;
                }
        }
@@@ -636,13 -657,9 +678,13 @@@ static int notify_ust_apps(int active
                goto error;
        }
  
 +      tracepoint(ust_notify_apps_start);
 +
        /* Wake waiting process */
        futex_wait_update((int32_t *) wait_shm_mmap, active);
  
 +      tracepoint(ust_notify_apps_stop);
 +
        /* Apps notified successfully */
        return 0;
  
@@@ -665,7 -682,7 +707,7 @@@ static int setup_lttng_msg(struct comma
  
        cmd_ctx->llm = zmalloc(sizeof(struct lttcomm_lttng_msg) + buf_size);
        if (cmd_ctx->llm == NULL) {
-               perror("zmalloc");
+               PERROR("zmalloc");
                ret = -ENOMEM;
                goto error;
        }
@@@ -746,8 -763,8 +788,8 @@@ static int update_kernel_stream(struct 
                        continue;
                }
  
-               /* This is not suppose to be 0 but this is an extra security check */
-               if (session->kernel_session->consumer_fd == 0) {
+               /* This is not suppose to be -1 but this is an extra security check */
+               if (session->kernel_session->consumer_fd < 0) {
                        session->kernel_session->consumer_fd = consumer_data->cmd_sock;
                }
  
@@@ -821,13 -838,11 +863,13 @@@ static void *thread_manage_kernel(void 
        char tmp;
        struct lttng_poll_event events;
  
 +      tracepoint(sessiond_th_kern_start);
 +
        DBG("Thread manage kernel started");
  
        ret = create_thread_poll_set(&events, 2);
        if (ret < 0) {
-               goto error;
+               goto error_poll_create;
        }
  
        ret = lttng_poll_add(&events, kernel_poll_pipe[0], LPOLLIN);
                /* Zeroed the poll events */
                lttng_poll_reset(&events);
  
 +              tracepoint(sessiond_th_kern_poll);
 +
                /* Poll infinite value of time */
        restart:
                ret = lttng_poll_wait(&events, -1);
        }
  
  error:
-       DBG("Kernel thread dying");
-       close(kernel_poll_pipe[0]);
-       close(kernel_poll_pipe[1]);
        lttng_poll_clean(&events);
+ error_poll_create:
+       DBG("Kernel thread dying");
        return NULL;
  }
  
   */
  static void *thread_manage_consumer(void *data)
  {
-       int sock = 0, i, ret, pollfd;
+       int sock = -1, i, ret, pollfd;
        uint32_t revents, nb_fd;
        enum lttcomm_return_code code;
        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);
        if (ret < 0) {
-               goto error;
+               goto error_listen;
        }
  
        /*
         */
        ret = create_thread_poll_set(&events, 2);
        if (ret < 0) {
-               goto error;
+               goto error_poll;
        }
  
        ret = lttng_poll_add(&events, consumer_data->err_sock, LPOLLIN | LPOLLRDHUP);
  
        nb_fd = LTTNG_POLL_GETNB(&events);
  
 +      tracepoint(sessiond_th_kcon_poll);
 +
        /* Inifinite blocking call, waiting for transmission */
  restart:
        ret = lttng_poll_wait(&events, -1);
@@@ -1083,16 -1089,33 +1122,33 @@@ restart_poll
        ERR("consumer return code : %s", lttcomm_get_readable_code(-code));
  
  error:
-       DBG("consumer thread dying");
-       close(consumer_data->err_sock);
-       close(consumer_data->cmd_sock);
-       close(sock);
+       if (consumer_data->err_sock >= 0) {
+               ret = close(consumer_data->err_sock);
+               if (ret) {
+                       PERROR("close");
+               }
+       }
+       if (consumer_data->cmd_sock >= 0) {
+               ret = close(consumer_data->cmd_sock);
+               if (ret) {
+                       PERROR("close");
+               }
+       }
+       if (sock >= 0) {
+               ret = close(sock);
+               if (ret) {
+                       PERROR("close");
+               }
+       }
  
        unlink(consumer_data->err_unix_sock_path);
        unlink(consumer_data->cmd_unix_sock_path);
        consumer_data->pid = 0;
  
        lttng_poll_clean(&events);
+ error_poll:
+ error_listen:
+       DBG("consumer thread cleanup completed");
  
        return NULL;
  }
@@@ -1107,8 -1130,6 +1163,8 @@@ static void *thread_manage_apps(void *d
        struct ust_command ust_cmd;
        struct lttng_poll_event events;
  
 +      tracepoint(sessiond_th_apps_start);
 +
        DBG("[thread] Manage application started");
  
        rcu_register_thread();
  
        ret = create_thread_poll_set(&events, 2);
        if (ret < 0) {
-               goto error;
+               goto error_poll_create;
        }
  
        ret = lttng_poll_add(&events, apps_cmd_pipe[0], LPOLLIN | LPOLLRDHUP);
  
                DBG("Apps thread polling on %d fds", nb_fd);
  
 +              tracepoint(sessiond_th_apps_poll);
 +
                /* Inifinite blocking call, waiting for transmission */
        restart:
                ret = lttng_poll_wait(&events, -1);
                                        ERR("Apps command pipe error");
                                        goto error;
                                } else if (revents & LPOLLIN) {
 +                                      system("sysctl vm.drop_caches=3");
 +                                      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");
+                                               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);
                                        } else if (ret < 0) {
                                                break;
                                        }
 +                                      tracepoint(ust_register_add_stop);
  
                                        /*
                                         * Validate UST version compatibility.
                                                update_ust_app(ust_cmd.sock);
                                        }
  
 +                                      tracepoint(ust_register_done_start);
                                        ret = ust_app_register_done(ust_cmd.sock);
                                        if (ret < 0) {
                                                /*
                                                 */
                                                ust_app_unregister(ust_cmd.sock);
                                        } else {
 +                                              tracepoint(ust_register_done_stop);
                                                /*
                                                 * We just need here to monitor the close of the UST
                                                 * socket and poll set monitor those by default.
+                                                * Listen on POLLIN (even if we never expect any
+                                                * data) to ensure that hangup wakes us.
                                                 */
-                                               ret = lttng_poll_add(&events, ust_cmd.sock, 0);
+                                               ret = lttng_poll_add(&events, ust_cmd.sock, LPOLLIN);
                                                if (ret < 0) {
                                                        goto error;
                                                }
                                                DBG("Apps with sock %d added to poll set",
                                                                ust_cmd.sock);
                                        }
 -
                                        break;
                                }
                        } else {
                                 * 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) {
  
                                        /* Socket closed on remote end. */
                                        ust_app_unregister(pollfd);
 +
 +                                      tracepoint(ust_unregister_stop);
                                        break;
                                }
                        }
        }
  
  error:
-       DBG("Application communication apps dying");
-       close(apps_cmd_pipe[0]);
-       close(apps_cmd_pipe[1]);
        lttng_poll_clean(&events);
+ error_poll_create:
+       DBG("Application communication apps thread cleanup complete");
        rcu_thread_offline();
        rcu_unregister_thread();
        return NULL;
@@@ -1267,8 -1275,6 +1322,8 @@@ static void *thread_dispatch_ust_regist
        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) {
                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) {
                                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"
                        ret = write(apps_cmd_pipe[1], ust_cmd,
                                        sizeof(struct ust_command));
                        if (ret < 0) {
-                               perror("write apps cmd pipe");
+                               PERROR("write apps cmd pipe");
                                if (errno == EBADF) {
                                        /*
                                         * We can't inform the application thread to process
                        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);
        }
@@@ -1334,7 -1334,7 +1389,7 @@@ error
   */
  static void *thread_registration_apps(void *data)
  {
-       int sock = 0, i, ret, pollfd;
+       int sock = -1, i, ret, pollfd;
        uint32_t revents, nb_fd;
        struct lttng_poll_event events;
        /*
         */
        struct ust_command *ust_cmd = NULL;
  
 +      tracepoint(sessiond_th_reg_start);
 +
        DBG("[thread] Manage application registration started");
  
        ret = lttcomm_listen_unix_sock(apps_sock);
        if (ret < 0) {
-               goto error;
+               goto error_listen;
        }
  
        /*
         */
        ret = create_thread_poll_set(&events, 2);
        if (ret < 0) {
-               goto error;
+               goto error_create_poll;
        }
  
        /* Add the application registration socket */
        ret = lttng_poll_add(&events, apps_sock, LPOLLIN | LPOLLRDHUP);
        if (ret < 0) {
-               goto error;
+               goto error_poll_add;
        }
  
        /* Notify all applications to register */
        while (1) {
                DBG("Accepting application registration");
  
 +              tracepoint(sessiond_th_reg_poll);
 +
                nb_fd = LTTNG_POLL_GETNB(&events);
  
                /* Inifinite blocking call, waiting for transmission */
                                        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;
                                        /* Create UST registration command for enqueuing */
                                        ust_cmd = zmalloc(sizeof(struct ust_command));
                                        if (ust_cmd == NULL) {
-                                               perror("ust command zmalloc");
+                                               PERROR("ust command zmalloc");
                                                goto error;
                                        }
  
                                                        sizeof(struct ust_register_msg));
                                        if (ret < 0 || ret < sizeof(struct ust_register_msg)) {
                                                if (ret < 0) {
-                                                       perror("lttcomm_recv_unix_sock register apps");
+                                                       PERROR("lttcomm_recv_unix_sock register apps");
                                                } else {
                                                        ERR("Wrong size received on apps register");
                                                }
                                                free(ust_cmd);
-                                               close(sock);
+                                               ret = close(sock);
+                                               if (ret) {
+                                                       PERROR("close");
+                                               }
+                                               sock = -1;
                                                continue;
                                        }
  
                                        ust_cmd->sock = sock;
+                                       sock = -1;
  
                                        DBG("UST registration received with pid:%d ppid:%d uid:%d"
                                                        " gid:%d sock:%d name:%s (version %d.%d)",
                                         * barrier with the exchange in cds_wfq_enqueue.
                                         */
                                        futex_nto1_wake(&ust_cmd_queue.futex);
 +
 +                                      tracepoint(ust_register_stop);
                                }
                        }
                }
        }
  
  error:
-       DBG("UST Registration thread dying");
        /* Notify that the registration thread is gone */
        notify_ust_apps(0);
  
-       close(apps_sock);
-       close(sock);
+       if (apps_sock >= 0) {
+               ret = close(apps_sock);
+               if (ret) {
+                       PERROR("close");
+               }
+       }
+       if (sock >= 0) {
+               ret = close(sock);
+               if (ret) {
+                       PERROR("close");
+               }
+       }
        unlink(apps_unix_sock_path);
  
+ error_poll_add:
        lttng_poll_clean(&events);
+ error_listen:
+ error_create_poll:
+       DBG("UST Registration thread cleanup complete");
  
        return NULL;
  }
@@@ -1721,17 -1729,17 +1793,17 @@@ static pid_t spawn_consumerd(struct con
                        break;
                }
                default:
-                       perror("unknown consumer type");
+                       PERROR("unknown consumer type");
                        exit(EXIT_FAILURE);
                }
                if (errno != 0) {
-                       perror("kernel start consumer exec");
+                       PERROR("kernel start consumer exec");
                }
                exit(EXIT_FAILURE);
        } else if (pid > 0) {
                ret = pid;
        } else {
-               perror("start consumer fork");
+               PERROR("start consumer fork");
                ret = -errno;
        }
  error:
@@@ -1822,20 -1830,30 +1894,30 @@@ static int init_kernel_tracer(void
  
  error_version:
        modprobe_remove_lttng_control();
-       close(kernel_tracer_fd);
-       kernel_tracer_fd = 0;
+       ret = close(kernel_tracer_fd);
+       if (ret) {
+               PERROR("close");
+       }
+       kernel_tracer_fd = -1;
        return LTTCOMM_KERN_VERSION;
  
  error_modules:
-       close(kernel_tracer_fd);
+       ret = close(kernel_tracer_fd);
+       if (ret) {
+               PERROR("close");
+       }
  
  error_open:
        modprobe_remove_lttng_control();
  
  error:
        WARN("No kernel tracer available");
-       kernel_tracer_fd = 0;
-       return LTTCOMM_KERN_NA;
+       kernel_tracer_fd = -1;
+       if (!is_root) {
+               return LTTCOMM_NEED_ROOT_SESSIOND;
+       } else {
+               return LTTCOMM_KERN_NA;
+       }
  }
  
  /*
@@@ -1848,10 -1866,10 +1930,10 @@@ static int init_kernel_tracing(struct l
        if (session->consumer_fds_sent == 0) {
                /*
                 * Assign default kernel consumer socket if no consumer assigned to the
-                * kernel session. At this point, it's NOT suppose to be 0 but this is
+                * kernel session. At this point, it's NOT supposed to be -1 but this is
                 * an extra security check.
                 */
-               if (session->consumer_fd == 0) {
+               if (session->consumer_fd < 0) {
                        session->consumer_fd = kconsumer_data.cmd_sock;
                }
  
@@@ -1939,7 -1957,7 +2021,7 @@@ static int create_kernel_session(struc
        }
  
        /* Set kernel consumer socket fd */
-       if (kconsumer_data.cmd_sock) {
+       if (kconsumer_data.cmd_sock >= 0) {
                session->kernel_session->consumer_fd = kconsumer_data.cmd_sock;
        }
  
@@@ -2828,7 -2846,8 +2910,8 @@@ static int cmd_start_trace(struct ltt_s
        usess = session->ust_session;
  
        if (session->enabled) {
-               ret = LTTCOMM_UST_START_FAIL;
+               /* Already started. */
+               ret = LTTCOMM_TRACE_ALREADY_STARTED;
                goto error;
        }
  
                }
  
                /* Open kernel metadata stream */
-               if (ksession->metadata_stream_fd == 0) {
+               if (ksession->metadata_stream_fd < 0) {
                        ret = kernel_open_metadata_stream(ksession);
                        if (ret < 0) {
                                ERR("Kernel create metadata stream failed");
@@@ -2920,7 -2939,7 +3003,7 @@@ static int cmd_stop_trace(struct ltt_se
        usess = session->ust_session;
  
        if (!session->enabled) {
-               ret = LTTCOMM_UST_STOP_FAIL;
+               ret = LTTCOMM_TRACE_ALREADY_STOPPED;
                goto error;
        }
  
@@@ -2971,11 -2990,12 +3054,12 @@@ error
  /*
   * Command LTTNG_CREATE_SESSION processed by the client thread.
   */
- static int cmd_create_session(char *name, char *path, struct ucred *creds)
+ static int cmd_create_session(char *name, char *path, lttng_sock_cred *creds)
  {
        int ret;
  
-       ret = session_create(name, path, creds->uid, creds->gid);
+       ret = session_create(name, path, LTTNG_SOCK_GET_UID_CRED(creds),
+                       LTTNG_SOCK_GET_GID_CRED(creds));
        if (ret != LTTCOMM_OK) {
                goto error;
        }
@@@ -3004,7 -3024,7 +3088,7 @@@ static int cmd_destroy_session(struct l
         */
        ret = notify_thread_pipe(kernel_poll_pipe[1]);
        if (ret < 0) {
-               perror("write kernel poll pipe");
+               PERROR("write kernel poll pipe");
        }
  
        ret = session_destroy(session);
@@@ -3244,7 -3264,11 +3328,11 @@@ static int process_client_msg(struct co
  
        if (opt_no_kernel && need_domain
                        && cmd_ctx->lsm->domain.type == LTTNG_DOMAIN_KERNEL) {
-               ret = LTTCOMM_KERN_NA;
+               if (!is_root) {
+                       ret = LTTCOMM_NEED_ROOT_SESSIOND;
+               } else {
+                       ret = LTTCOMM_KERN_NA;
+               }
                goto error;
        }
  
        switch (cmd_ctx->lsm->domain.type) {
        case LTTNG_DOMAIN_KERNEL:
                if (!is_root) {
-                       ret = LTTCOMM_KERN_NA;
+                       ret = LTTCOMM_NEED_ROOT_SESSIOND;
                        goto error;
                }
  
                /* Kernel tracer check */
-               if (kernel_tracer_fd == 0) {
+               if (kernel_tracer_fd == -1) {
                        /* Basically, load kernel tracer modules */
                        ret = init_kernel_tracer();
                        if (ret != 0) {
@@@ -3401,7 -3425,8 +3489,8 @@@ skip_domain
         */
        if (need_tracing_session) {
                if (!session_access_ok(cmd_ctx->session,
-                               cmd_ctx->creds.uid, cmd_ctx->creds.gid)) {
+                               LTTNG_SOCK_GET_UID_CRED(&cmd_ctx->creds),
+                               LTTNG_SOCK_GET_GID_CRED(&cmd_ctx->creds))) {
                        ret = LTTCOMM_EPERM;
                        goto error;
                }
        }
        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:
                unsigned int nr_sessions;
  
                session_lock_list();
-               nr_sessions = lttng_sessions_count(cmd_ctx->creds.uid, cmd_ctx->creds.gid);
+               nr_sessions = lttng_sessions_count(
+                               LTTNG_SOCK_GET_UID_CRED(&cmd_ctx->creds),
+                               LTTNG_SOCK_GET_GID_CRED(&cmd_ctx->creds));
  
                ret = setup_lttng_msg(cmd_ctx, sizeof(struct lttng_session) * nr_sessions);
                if (ret < 0) {
  
                /* Filled the session array */
                list_lttng_sessions((struct lttng_session *)(cmd_ctx->llm->payload),
-                       cmd_ctx->creds.uid, cmd_ctx->creds.gid);
+                       LTTNG_SOCK_GET_UID_CRED(&cmd_ctx->creds),
+                       LTTNG_SOCK_GET_GID_CRED(&cmd_ctx->creds));
  
                session_unlock_list();
  
@@@ -3655,13 -3679,11 +3747,13 @@@ init_setup_error
   */
  static void *thread_manage_clients(void *data)
  {
-       int sock = 0, ret, i, pollfd;
+       int sock = -1, ret, i, pollfd;
        uint32_t revents, nb_fd;
        struct command_ctx *cmd_ctx = NULL;
        struct lttng_poll_event events;
  
 +      tracepoint(sessiond_th_cli_start);
 +
        DBG("[thread] Manage client started");
  
        rcu_register_thread();
        while (1) {
                DBG("Accepting client command ...");
  
 +              tracepoint(sessiond_th_cli_poll);
 +
                nb_fd = LTTNG_POLL_GETNB(&events);
  
                /* Inifinite blocking call, waiting for transmission */
                /* Allocate context command to process the client request */
                cmd_ctx = zmalloc(sizeof(struct command_ctx));
                if (cmd_ctx == NULL) {
-                       perror("zmalloc cmd_ctx");
+                       PERROR("zmalloc cmd_ctx");
                        goto error;
                }
  
                /* Allocate data buffer for reception */
                cmd_ctx->lsm = zmalloc(sizeof(struct lttcomm_session_msg));
                if (cmd_ctx->lsm == NULL) {
-                       perror("zmalloc cmd_ctx->lsm");
+                       PERROR("zmalloc cmd_ctx->lsm");
                        goto error;
                }
  
                                sizeof(struct lttcomm_session_msg), &cmd_ctx->creds);
                if (ret <= 0) {
                        DBG("Nothing recv() from client... continuing");
-                       close(sock);
+                       ret = close(sock);
+                       if (ret) {
+                               PERROR("close");
+                       }
+                       sock = -1;
                        free(cmd_ctx);
                        continue;
                }
                }
  
                /* End of transmission */
-               close(sock);
+               ret = close(sock);
+               if (ret) {
+                       PERROR("close");
+               }
+               sock = -1;
  
                clean_command_ctx(&cmd_ctx);
        }
  error:
        DBG("Client thread dying");
        unlink(client_unix_sock_path);
-       close(client_sock);
-       close(sock);
+       if (client_sock >= 0) {
+               ret = close(client_sock);
+               if (ret) {
+                       PERROR("close");
+               }
+       }
+       if (sock >= 0) {
+               ret = close(sock);
+               if (ret) {
+                       PERROR("close");
+               }
+       }
  
        lttng_poll_clean(&events);
        clean_command_ctx(&cmd_ctx);
@@@ -3947,11 -3985,11 +4057,11 @@@ static int parse_args(int argc, char **
                        opt_no_kernel = 1;
                        break;
                case 'q':
-                       opt_quiet = 1;
+                       lttng_opt_quiet = 1;
                        break;
                case 'v':
                        /* Verbose level can increase using multiple -v */
-                       opt_verbose += 1;
+                       lttng_opt_verbose += 1;
                        break;
                case 'Z':
                        opt_verbose_consumer += 1;
@@@ -4002,7 -4040,7 +4112,7 @@@ static int init_daemon_socket(void
        ret = chmod(client_unix_sock_path, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
        if (ret < 0) {
                ERR("Set file permissions failed: %s", client_unix_sock_path);
-               perror("chmod");
+               PERROR("chmod");
                goto end;
        }
  
                        S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
        if (ret < 0) {
                ERR("Set file permissions failed: %s", apps_unix_sock_path);
-               perror("chmod");
+               PERROR("chmod");
                goto end;
        }
  
@@@ -4064,42 -4102,42 +4174,42 @@@ static int set_permissions(char *rundir
        ret = chown(rundir, 0, gid);
        if (ret < 0) {
                ERR("Unable to set group on %s", rundir);
-               perror("chown");
+               PERROR("chown");
        }
  
        /* Ensure tracing group can search the run dir */
-       ret = chmod(rundir, S_IRWXU | S_IXGRP);
+       ret = chmod(rundir, S_IRWXU | S_IXGRP | S_IXOTH);
        if (ret < 0) {
                ERR("Unable to set permissions on %s", rundir);
-               perror("chmod");
+               PERROR("chmod");
        }
  
        /* lttng client socket path */
        ret = chown(client_unix_sock_path, 0, gid);
        if (ret < 0) {
                ERR("Unable to set group on %s", client_unix_sock_path);
-               perror("chown");
+               PERROR("chown");
        }
  
        /* kconsumer error socket path */
        ret = chown(kconsumer_data.err_unix_sock_path, 0, gid);
        if (ret < 0) {
                ERR("Unable to set group on %s", kconsumer_data.err_unix_sock_path);
-               perror("chown");
+               PERROR("chown");
        }
  
        /* 64-bit ustconsumer error socket path */
        ret = chown(ustconsumer64_data.err_unix_sock_path, 0, gid);
        if (ret < 0) {
                ERR("Unable to set group on %s", ustconsumer64_data.err_unix_sock_path);
-               perror("chown");
+               PERROR("chown");
        }
  
        /* 32-bit ustconsumer compat32 error socket path */
        ret = chown(ustconsumer32_data.err_unix_sock_path, 0, gid);
        if (ret < 0) {
                ERR("Unable to set group on %s", ustconsumer32_data.err_unix_sock_path);
-               perror("chown");
+               PERROR("chown");
        }
  
        DBG("All permissions are set");
  
  /*
   * Create the pipe used to wake up the kernel thread.
+  * Closed in cleanup().
   */
  static int create_kernel_poll_pipe(void)
  {
-       return pipe2(kernel_poll_pipe, O_CLOEXEC);
+       int ret, i;
+       ret = pipe(kernel_poll_pipe);
+       if (ret < 0) {
+               PERROR("kernel poll pipe");
+               goto error;
+       }
+       for (i = 0; i < 2; i++) {
+               ret = fcntl(kernel_poll_pipe[i], F_SETFD, FD_CLOEXEC);
+               if (ret < 0) {
+                       PERROR("fcntl kernel_poll_pipe");
+                       goto error;
+               }
+       }
+ error:
+       return ret;
  }
  
  /*
   * Create the application command pipe to wake thread_manage_apps.
+  * Closed in cleanup().
   */
  static int create_apps_cmd_pipe(void)
  {
-       return pipe2(apps_cmd_pipe, O_CLOEXEC);
+       int ret, i;
+       ret = pipe(apps_cmd_pipe);
+       if (ret < 0) {
+               PERROR("apps cmd pipe");
+               goto error;
+       }
+       for (i = 0; i < 2; i++) {
+               ret = fcntl(apps_cmd_pipe[i], F_SETFD, FD_CLOEXEC);
+               if (ret < 0) {
+                       PERROR("fcntl apps_cmd_pipe");
+                       goto error;
+               }
+       }
+ error:
+       return ret;
  }
  
  /*
@@@ -4178,10 -4252,11 +4324,11 @@@ static int set_consumer_sockets(struct 
        ret = mkdir(path, S_IRWXU);
        if (ret < 0) {
                if (errno != EEXIST) {
+                       PERROR("mkdir");
                        ERR("Failed to create %s", path);
                        goto error;
                }
-               ret = 0;
+               ret = -1;
        }
  
        /* Create the kconsumerd error unix socket */
@@@ -4242,7 -4317,7 +4389,7 @@@ static int set_signal_handler(void
        sigset_t sigset;
  
        if ((ret = sigemptyset(&sigset)) < 0) {
-               perror("sigemptyset");
+               PERROR("sigemptyset");
                return ret;
        }
  
        sa.sa_mask = sigset;
        sa.sa_flags = 0;
        if ((ret = sigaction(SIGTERM, &sa, NULL)) < 0) {
-               perror("sigaction");
+               PERROR("sigaction");
                return ret;
        }
  
        if ((ret = sigaction(SIGINT, &sa, NULL)) < 0) {
-               perror("sigaction");
+               PERROR("sigaction");
                return ret;
        }
  
        if ((ret = sigaction(SIGPIPE, &sa, NULL)) < 0) {
-               perror("sigaction");
+               PERROR("sigaction");
                return ret;
        }
  
@@@ -4284,7 -4359,7 +4431,7 @@@ static void set_ulimit(void
  
        ret = setrlimit(RLIMIT_NOFILE, &lim);
        if (ret < 0) {
-               perror("failed to set open files limit");
+               PERROR("failed to set open files limit");
        }
  }
  
@@@ -4297,8 -4372,6 +4444,8 @@@ int main(int argc, char **argv
        void *status;
        const char *home_path;
  
 +      tracepoint(sessiond_boot_start);
 +
        init_kernel_workarounds();
  
        rcu_register_thread();
        if (opt_daemon) {
                ret = daemon(0, 0);
                if (ret < 0) {
-                       perror("daemon");
+                       PERROR("daemon");
                        goto error;
                }
        }
        ret = pthread_create(&client_thread, NULL,
                        thread_manage_clients, (void *) NULL);
        if (ret != 0) {
-               perror("pthread_create clients");
+               PERROR("pthread_create clients");
                goto exit_client;
        }
  
        ret = pthread_create(&dispatch_thread, NULL,
                        thread_dispatch_ust_registration, (void *) NULL);
        if (ret != 0) {
-               perror("pthread_create dispatch");
+               PERROR("pthread_create dispatch");
                goto exit_dispatch;
        }
  
        ret = pthread_create(&reg_apps_thread, NULL,
                        thread_registration_apps, (void *) NULL);
        if (ret != 0) {
-               perror("pthread_create registration");
+               PERROR("pthread_create registration");
                goto exit_reg_apps;
        }
  
        ret = pthread_create(&apps_thread, NULL,
                        thread_manage_apps, (void *) NULL);
        if (ret != 0) {
-               perror("pthread_create apps");
+               PERROR("pthread_create apps");
                goto exit_apps;
        }
  
        ret = pthread_create(&kernel_thread, NULL,
                        thread_manage_kernel, (void *) NULL);
        if (ret != 0) {
-               perror("pthread_create kernel");
+               PERROR("pthread_create kernel");
                goto exit_kernel;
        }
  
 +      tracepoint(sessiond_boot_end);
 +
        ret = pthread_join(kernel_thread, &status);
        if (ret != 0) {
-               perror("pthread_join");
+               PERROR("pthread_join");
                goto error;     /* join error, exit without cleanup */
        }
  
  exit_kernel:
        ret = pthread_join(apps_thread, &status);
        if (ret != 0) {
-               perror("pthread_join");
+               PERROR("pthread_join");
                goto error;     /* join error, exit without cleanup */
        }
  
  exit_apps:
        ret = pthread_join(reg_apps_thread, &status);
        if (ret != 0) {
-               perror("pthread_join");
+               PERROR("pthread_join");
                goto error;     /* join error, exit without cleanup */
        }
  
  exit_reg_apps:
        ret = pthread_join(dispatch_thread, &status);
        if (ret != 0) {
-               perror("pthread_join");
+               PERROR("pthread_join");
                goto error;     /* join error, exit without cleanup */
        }
  
  exit_dispatch:
        ret = pthread_join(client_thread, &status);
        if (ret != 0) {
-               perror("pthread_join");
+               PERROR("pthread_join");
                goto error;     /* join error, exit without cleanup */
        }
  
        ret = join_consumer_thread(&kconsumer_data);
        if (ret != 0) {
-               perror("join_consumer");
+               PERROR("join_consumer");
                goto error;     /* join error, exit without cleanup */
        }
  
index 0bf3ff58f0dd138e553f9c1dafaa38d418b1d09c,432d07ecea5eb4462d36a6a4727737532e97791f..7f6040c4b65360c67df2a7b072ca47e66438705f
@@@ -28,8 -28,6 +28,8 @@@
  
  #include <common/error.h>
  
 +#include "benchmark.h"
 +#include "measures.h"
  #include "shm.h"
  
  /*
@@@ -45,8 -43,6 +45,8 @@@ static int get_wait_shm(char *shm_path
        int wait_shm_fd, ret;
        mode_t mode;
  
 +      tracepoint(ust_notify_perms_start);
 +
        /* Default permissions */
        mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
  
@@@ -55,7 -51,7 +55,7 @@@
                ret = chown(shm_path, 0, 0);
                if (ret < 0) {
                        if (errno != ENOENT) {
-                               perror("chown wait shm");
+                               PERROR("chown wait shm");
                                goto error;
                        }
                }
@@@ -69,7 -65,7 +69,7 @@@
                ret = chown(shm_path, getuid(), getgid());
                if (ret < 0) {
                        if (errno != ENOENT) {
-                               perror("chown wait shm");
+                               PERROR("chown wait shm");
                                goto error;
                        }
                }
@@@ -81,7 -77,7 +81,7 @@@
        ret = chmod(shm_path, mode);
        if (ret < 0) {
                if (errno != ENOENT) {
-                       perror("chmod wait shm");
+                       PERROR("chmod wait shm");
                        goto error;
                }
        }
         */
        umask(~mode);
  
 +      tracepoint(ust_notify_perms_stop);
 +
 +      tracepoint(ust_notify_shm_start);
        /*
         * Try creating shm (or get rw access). We don't do an exclusive open,
         * because we allow other processes to create+ftruncate it concurrently.
         */
        wait_shm_fd = shm_open(shm_path, O_RDWR | O_CREAT, mode);
        if (wait_shm_fd < 0) {
-               perror("shm_open wait shm");
+               PERROR("shm_open wait shm");
                goto error;
        }
  
        ret = ftruncate(wait_shm_fd, mmap_size);
        if (ret < 0) {
-               perror("ftruncate wait shm");
+               PERROR("ftruncate wait shm");
                exit(EXIT_FAILURE);
        }
  
+ #ifndef __FreeBSD__
        ret = fchmod(wait_shm_fd, mode);
        if (ret < 0) {
-               perror("fchmod");
+               PERROR("fchmod");
                exit(EXIT_FAILURE);
        }
+ #else
+ #warning "FreeBSD does not support setting file mode on shm FD. Remember that for secure use, lttng-sessiond should be started before applications linked on lttng-ust."
+ #endif
  
 +      tracepoint(ust_notify_shm_stop);
 +
        DBG("Got the wait shm fd %d", wait_shm_fd);
  
        return wait_shm_fd;
@@@ -148,16 -143,13 +152,16 @@@ char *shm_ust_get_mmap(char *shm_path, 
                goto error;
        }
  
 +      tracepoint(ust_notify_mmap_start);
 +
        wait_shm_mmap = mmap(NULL, mmap_size, PROT_WRITE | PROT_READ,
                        MAP_SHARED, wait_shm_fd, 0);
  
 +      tracepoint(ust_notify_mmap_stop);
        /* close shm fd immediately after taking the mmap reference */
        ret = close(wait_shm_fd);
        if (ret) {
-               perror("Error closing fd");
+               PERROR("Error closing fd");
        }
  
        if (wait_shm_mmap == MAP_FAILED) {
This page took 0.051556 seconds and 4 git commands to generate.