Fix: add urcu-bp TLS fixup
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 12 Jan 2015 18:32:25 +0000 (13:32 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 12 Jan 2015 18:32:25 +0000 (13:32 -0500)
When performing a library base address statedump, the UST threads can
grab the RCU read-side lock, which touch a TLS. We should "pre-fault"
this TLS in the constructor to eliminate a deadlock involving libc
dynamic loader lock.

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

index 77cde295b7beae3c0a47a99fcbe486532e3680c3..8e1a0f35ff74c820f0cc195a55ae38bf27850b1a 100644 (file)
@@ -265,6 +265,16 @@ void lttng_fixup_nest_count_tls(void)
        asm volatile ("" : : "m" (URCU_TLS(lttng_ust_nest_count)));
 }
 
+/*
+ * Fixup urcu bp TLS.
+ */
+static
+void lttng_fixup_urcu_bp_tls(void)
+{
+       rcu_read_lock();
+       rcu_read_unlock();
+}
+
 int lttng_get_notify_socket(void *owner)
 {
        struct sock_info *info = owner;
@@ -1347,6 +1357,7 @@ void __attribute__((constructor)) lttng_ust_init(void)
         * to be the dynamic linker mutex) and ust_lock, taken within
         * the ust lock.
         */
+       lttng_fixup_urcu_bp_tls();
        lttng_fixup_ringbuffer_tls();
        lttng_fixup_vtid_tls();
        lttng_fixup_nest_count_tls();
This page took 0.025739 seconds and 4 git commands to generate.