Merged into master, 2.11, 2.10, 2.9, thanks! Mathieu
----- On Mar 8, 2019, at 10:01 AM, Jonathan Rajotte jonathan.rajotte-jul...@efficios.com wrote: > Prevent us from deadlocking ourself if some glibc implementation > decide to hold the dl_load_* locks on fork operation. > > This happens on Yocto Rocko and up when performing python tracing (import > lttngust). Why Yocto decided to patch glibc this way is a mystery > (ongoing effort) [1][2][3]. > > Anyhow, we can prevent this by moving the initialization of the > wait_shm_mmap to the library constructor since the dl_load_* locks are > nestable mutex. > > Nothing in the git log for the wait_shm_mmap indicate a specific reason > to why it was done inside the listener thread. Doing it inside > wait_for_sessiond can help in some corner cases were /dev/shm > (or the shm path) files are unlinked. This is not much of an advantage. > > [1] From yocto master branch: ee9db1a9152e8757ce4d831ff9f4472ff5a57dad > [2] From OE-Core: f2e586ebf59a9b7d5b216fc92aeb892069a4b0c1 > [3] > https://www.mail-archive.com/openembedded-core@lists.openembedded.org/msg101186.html > > This was tested on a Yocto Rocko qemu x86-64 image with python agent > enabled. > > Signed-off-by: Jonathan Rajotte <jonathan.rajotte-jul...@efficios.com> > --- > liblttng-ust/lttng-ust-comm.c | 76 +++++++++++++++++++++++++++-------- > 1 file changed, 60 insertions(+), 16 deletions(-) > > diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c > index eab2d8eb..61dbb41b 100644 > --- a/liblttng-ust/lttng-ust-comm.c > +++ b/liblttng-ust/lttng-ust-comm.c > @@ -264,7 +264,7 @@ struct sock_info global_apps = { > .global = 1, > > .root_handle = -1, > - .allowed = 1, > + .allowed = 0, > .thread_active = 0, > > .sock_path = LTTNG_DEFAULT_RUNDIR "/" LTTNG_UST_SOCK_FILENAME, > @@ -343,6 +343,8 @@ extern void lttng_ring_buffer_client_discard_exit(void); > extern void lttng_ring_buffer_client_discard_rt_exit(void); > extern void lttng_ring_buffer_metadata_client_exit(void); > > +static char *get_map_shm(struct sock_info *sock_info); > + > ssize_t lttng_ust_read(int fd, void *buf, size_t len) > { > ssize_t ret; > @@ -434,25 +436,48 @@ void print_cmd(int cmd, int handle) > lttng_ust_obj_get_name(handle), handle); > } > > +static > +int setup_global_apps(void) > +{ > + int ret = 0; > + assert(!global_apps.wait_shm_mmap); > + > + global_apps.wait_shm_mmap = get_map_shm(&global_apps); > + if (!global_apps.wait_shm_mmap) { > + WARN("Unable to get map shm for global apps. Disabling > LTTng-UST global > tracing."); > + global_apps.allowed = 0; > + ret = -EIO; > + goto error; > + } > + > + global_apps.allowed = 1; > +error: > + return ret; > +} > static > int setup_local_apps(void) > { > + int ret = 0; > const char *home_dir; > uid_t uid; > > + assert(!local_apps.wait_shm_mmap); > + > uid = getuid(); > /* > * Disallow per-user tracing for setuid binaries. > */ > if (uid != geteuid()) { > assert(local_apps.allowed == 0); > - return 0; > + ret = 0; > + goto end; > } > home_dir = get_lttng_home_dir(); > if (!home_dir) { > WARN("HOME environment variable not set. Disabling LTTng-UST > per-user > tracing."); > assert(local_apps.allowed == 0); > - return -ENOENT; > + ret = -ENOENT; > + goto end; > } > local_apps.allowed = 1; > snprintf(local_apps.sock_path, PATH_MAX, "%s/%s/%s", > @@ -462,7 +487,16 @@ int setup_local_apps(void) > snprintf(local_apps.wait_shm_path, PATH_MAX, "/%s-%u", > LTTNG_UST_WAIT_FILENAME, > uid); > - return 0; > + > + local_apps.wait_shm_mmap = get_map_shm(&local_apps); > + if (!local_apps.wait_shm_mmap) { > + WARN("Unable to get map shm for local apps. Disabling LTTng-UST > per-user > tracing."); > + local_apps.allowed = 0; > + ret = -EIO; > + goto end; > + } > +end: > + return ret; > } > > /* > @@ -1305,19 +1339,17 @@ error: > static > void wait_for_sessiond(struct sock_info *sock_info) > { > + /* Use ust_lock to check if we should quit. */ > if (ust_lock()) { > goto quit; > } > if (wait_poll_fallback) { > goto error; > } > - if (!sock_info->wait_shm_mmap) { > - sock_info->wait_shm_mmap = get_map_shm(sock_info); > - if (!sock_info->wait_shm_mmap) > - goto error; > - } > ust_unlock(); > > + assert(sock_info->wait_shm_mmap); > + > DBG("Waiting for %s apps sessiond", sock_info->name); > /* Wait for futex wakeup */ > if (uatomic_read((int32_t *) sock_info->wait_shm_mmap)) > @@ -1756,8 +1788,15 @@ void __attribute__((constructor)) lttng_ust_init(void) > PERROR("sem_init"); > } > > + ret = setup_global_apps(); > + if (ret) { > + assert(global_apps.allowed == 0); > + DBG("global apps setup returned %d", ret); > + } > + > ret = setup_local_apps(); > if (ret) { > + assert(local_apps.allowed == 0); > DBG("local apps setup returned %d", ret); > } > > @@ -1781,14 +1820,18 @@ void __attribute__((constructor)) lttng_ust_init(void) > ERR("pthread_attr_setdetachstate: %s", strerror(ret)); > } > > - pthread_mutex_lock(&ust_exit_mutex); > - ret = pthread_create(&global_apps.ust_listener, &thread_attr, > - ust_listener_thread, &global_apps); > - if (ret) { > - ERR("pthread_create global: %s", strerror(ret)); > + if (global_apps.allowed) { > + pthread_mutex_lock(&ust_exit_mutex); > + ret = pthread_create(&global_apps.ust_listener, &thread_attr, > + ust_listener_thread, &global_apps); > + if (ret) { > + ERR("pthread_create global: %s", strerror(ret)); > + } > + global_apps.thread_active = 1; > + pthread_mutex_unlock(&ust_exit_mutex); > + } else { > + handle_register_done(&global_apps); > } > - global_apps.thread_active = 1; > - pthread_mutex_unlock(&ust_exit_mutex); > > if (local_apps.allowed) { > pthread_mutex_lock(&ust_exit_mutex); > @@ -1859,6 +1902,7 @@ void lttng_ust_cleanup(int exiting) > cleanup_sock_info(&global_apps, exiting); > cleanup_sock_info(&local_apps, exiting); > local_apps.allowed = 0; > + global_apps.allowed = 0; > /* > * The teardown in this function all affect data structures > * accessed under the UST lock by the listener thread. This > -- > 2.17.1 -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com _______________________________________________ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev