Fix: pre-fault TLS in ust-malloc instrumentation
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 26 Jul 2016 20:54:55 +0000 (16:54 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 26 Jul 2016 20:58:40 +0000 (16:58 -0400)
Faulting the TLS variable when accessed for the first time can trigger
deadlocks with internal libc lock when using the liblttng-ust-malloc
wrapper. Fix this by pre-faulting it in a library constructor, similarly
to the approach taken for all other TLS variables in lttng-ust.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
liblttng-ust-libc-wrapper/lttng-ust-malloc.c

index d1ad3cf5b146260cf93548df5bf2a41ae9358057..d91813e7f35b5e84878db20a9ea457ce21e22338 100644 (file)
@@ -416,6 +416,12 @@ int posix_memalign(void **memptr, size_t alignment, size_t size)
        return retval;
 }
 
+static
+void lttng_ust_fixup_malloc_nesting_tls(void)
+{
+       asm volatile ("" : : "m" (URCU_TLS(malloc_nesting)));
+}
+
 __attribute__((constructor))
 void lttng_ust_malloc_wrapper_init(void)
 {
@@ -423,6 +429,7 @@ void lttng_ust_malloc_wrapper_init(void)
        if (cur_alloc.calloc) {
                return;
        }
+       lttng_ust_fixup_malloc_nesting_tls();
        /*
         * Ensure the allocator is in place before the process becomes
         * multithreaded.
This page took 0.025613 seconds and 4 git commands to generate.