X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;ds=sidebyside;f=liblttng-ust%2Flttng-ust-comm.c;h=798c10a36c47bc1e7257227ba57dc46945fac853;hb=4807c6defbfaede1efe67750376595398ae0d9b8;hp=d35511b2f1afecc7bf16a10317955130c6cbc175;hpb=69400ac4a4e6575f749c6326df7c2a2c8ac3bdc5;p=lttng-ust.git diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c index d35511b2..798c10a3 100644 --- a/liblttng-ust/lttng-ust-comm.c +++ b/liblttng-ust/lttng-ust-comm.c @@ -37,14 +37,14 @@ #include #include #include +#include -#include #include -#include #include -#include -#include #include +#include +#include +#include "tracepoint-internal.h" #include "ltt-tracer-core.h" /* @@ -167,6 +167,7 @@ int register_app_to_sessiond(int socket) pid_t ppid; uid_t uid; gid_t gid; + uint32_t bits_per_long; char name[16]; /* process name */ } reg_msg; @@ -176,6 +177,7 @@ int register_app_to_sessiond(int socket) reg_msg.ppid = getppid(); reg_msg.uid = getuid(); reg_msg.gid = getgid(); + reg_msg.bits_per_long = CAA_BITS_PER_LONG; prctl_ret = prctl(PR_GET_NAME, (unsigned long) reg_msg.name, 0, 0, 0); if (prctl_ret) { ERR("Error executing prctl"); @@ -237,6 +239,7 @@ int handle_message(struct sock_info *sock_info, const struct lttng_ust_objd_ops *ops; struct ustcomm_ust_reply lur; int shm_fd, wait_fd; + union ust_args args; ust_lock(); @@ -269,7 +272,8 @@ int handle_message(struct sock_info *sock_info, default: if (ops->cmd) ret = ops->cmd(lum->handle, lum->cmd, - (unsigned long) &lum->u); + (unsigned long) &lum->u, + &args); else ret = -ENOSYS; break; @@ -291,19 +295,22 @@ end: * Special-case reply to send stream info. * Use lum.u output. */ - lur.u.stream.memory_map_size = lum->u.stream.memory_map_size; - shm_fd = lum->u.stream.shm_fd; - wait_fd = lum->u.stream.wait_fd; + lur.u.stream.memory_map_size = *args.stream.memory_map_size; + shm_fd = *args.stream.shm_fd; + wait_fd = *args.stream.wait_fd; break; case LTTNG_UST_METADATA: case LTTNG_UST_CHANNEL: - lur.u.channel.memory_map_size = lum->u.channel.memory_map_size; - shm_fd = lum->u.channel.shm_fd; - wait_fd = lum->u.channel.wait_fd; + lur.u.channel.memory_map_size = *args.channel.memory_map_size; + shm_fd = *args.channel.shm_fd; + wait_fd = *args.channel.wait_fd; break; - case LTTNG_UST_VERSION: + case LTTNG_UST_TRACER_VERSION: lur.u.version = lum->u.version; break; + case LTTNG_UST_TRACEPOINT_LIST_GET: + memcpy(&lur.u.tracepoint, &lum->u.tracepoint, sizeof(lur.u.tracepoint)); + break; } ret = send_reply(sock, &lur); if (ret < 0) { @@ -331,6 +338,50 @@ end: goto error; } } + /* + * We still have the memory map reference, and the fds have been + * sent to the sessiond. We can therefore close those fds. Note + * that we keep the write side of the wait_fd open, but close + * the read side. + */ + if (lur.ret_code == USTCOMM_OK) { + switch (lum->cmd) { + case LTTNG_UST_STREAM: + if (shm_fd >= 0) { + ret = close(shm_fd); + if (ret) { + PERROR("Error closing stream shm_fd"); + } + *args.stream.shm_fd = -1; + } + if (wait_fd >= 0) { + ret = close(wait_fd); + if (ret) { + PERROR("Error closing stream wait_fd"); + } + *args.stream.wait_fd = -1; + } + break; + case LTTNG_UST_METADATA: + case LTTNG_UST_CHANNEL: + if (shm_fd >= 0) { + ret = close(shm_fd); + if (ret) { + PERROR("Error closing channel shm_fd"); + } + *args.channel.shm_fd = -1; + } + if (wait_fd >= 0) { + ret = close(wait_fd); + if (ret) { + PERROR("Error closing channel wait_fd"); + } + *args.channel.wait_fd = -1; + } + break; + } + } + error: ust_unlock(); return ret; @@ -408,7 +459,7 @@ int get_wait_shm(struct sock_info *sock_info, size_t mmap_size) * shared memory map will have been created. */ pid = wait(&status); - if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { + if (pid < 0 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) { wait_shm_fd = -1; goto end; } @@ -556,14 +607,15 @@ void wait_for_sessiond(struct sock_info *sock_info) if (ret < 0) { if (errno == EFAULT) { wait_poll_fallback = 1; - WARN( + DBG( "Linux kernels 2.6.33 to 3.0 (with the exception of stable versions) " "do not support FUTEX_WAKE on read-only memory mappings correctly. " "Please upgrade your kernel " "(fix is commit 9ea71503a8ed9184d2d0b8ccc4d269d05f7940ae in Linux kernel " "mainline). LTTng-UST will use polling mode fallback."); + if (ust_debug()) + PERROR("futex"); } - PERROR("futex"); } } return; @@ -625,7 +677,7 @@ restart: /* Register */ ret = ustcomm_connect_unix_sock(sock_info->sock_path); if (ret < 0) { - ERR("Error connecting to %s apps socket", sock_info->name); + DBG("Info: sessiond not accepting connections to %s apps socket", sock_info->name); prev_connect_failed = 1; /* * If we cannot find the sessiond daemon, don't delay @@ -676,6 +728,20 @@ restart: switch (len) { case 0: /* orderly shutdown */ DBG("%s ltt-sessiond has performed an orderly shutdown\n", sock_info->name); + ust_lock(); + /* + * Either sessiond has shutdown or refused us by closing the socket. + * In either case, we don't want to delay construction execution, + * and we need to wait before retry. + */ + prev_connect_failed = 1; + /* + * If we cannot register to the sessiond daemon, don't + * delay constructor execution. + */ + ret = handle_register_done(sock_info); + assert(!ret); + ust_unlock(); goto end; case sizeof(lum): DBG("message received\n"); @@ -685,6 +751,7 @@ restart: } continue; case -1: + DBG("Receive failed from lttng-sessiond with errno %d", errno); if (errno == ECONNRESET) { ERR("%s remote end closed connection\n", sock_info->name); goto end; @@ -871,7 +938,7 @@ void __attribute__((destructor)) lttng_ust_exit(void) * in the middle of an tracepoint or ust tracing state modification. * Holding this mutex protects these structures across fork and clone. */ -void ust_before_fork(ust_fork_info_t *fork_info) +void ust_before_fork(sigset_t *save_sigset) { /* * Disable signals. This is to avoid that the child intervenes @@ -884,7 +951,7 @@ void ust_before_fork(ust_fork_info_t *fork_info) /* Disable signals */ sigfillset(&all_sigs); - ret = sigprocmask(SIG_BLOCK, &all_sigs, &fork_info->orig_sigs); + ret = sigprocmask(SIG_BLOCK, &all_sigs, save_sigset); if (ret == -1) { PERROR("sigprocmask"); } @@ -892,25 +959,25 @@ void ust_before_fork(ust_fork_info_t *fork_info) rcu_bp_before_fork(); } -static void ust_after_fork_common(ust_fork_info_t *fork_info) +static void ust_after_fork_common(sigset_t *restore_sigset) { int ret; DBG("process %d", getpid()); ust_unlock(); /* Restore signals */ - ret = sigprocmask(SIG_SETMASK, &fork_info->orig_sigs, NULL); + ret = sigprocmask(SIG_SETMASK, restore_sigset, NULL); if (ret == -1) { PERROR("sigprocmask"); } } -void ust_after_fork_parent(ust_fork_info_t *fork_info) +void ust_after_fork_parent(sigset_t *restore_sigset) { DBG("process %d", getpid()); rcu_bp_after_fork_parent(); /* Release mutexes and reenable signals */ - ust_after_fork_common(fork_info); + ust_after_fork_common(restore_sigset); } /* @@ -922,7 +989,7 @@ void ust_after_fork_parent(ust_fork_info_t *fork_info) * This is meant for forks() that have tracing in the child between the * fork and following exec call (if there is any). */ -void ust_after_fork_child(ust_fork_info_t *fork_info) +void ust_after_fork_child(sigset_t *restore_sigset) { DBG("process %d", getpid()); /* Release urcu mutexes */ @@ -930,6 +997,6 @@ void ust_after_fork_child(ust_fork_info_t *fork_info) lttng_ust_cleanup(0); lttng_context_vtid_reset(); /* Release mutexes and reenable signals */ - ust_after_fork_common(fork_info); + ust_after_fork_common(restore_sigset); lttng_ust_init(); }