From: Mathieu Desnoyers Date: Mon, 12 Jan 2015 18:27:53 +0000 (-0500) Subject: Fix: add urcu-bp TLS fixup X-Git-Tag: v2.7.0-rc1~64 X-Git-Url: http://git.lttng.org/?a=commitdiff_plain;ds=sidebyside;h=1556a5495c92bdd99e57faa87e21eb0b6f95c3a2;p=lttng-ust.git Fix: add urcu-bp TLS fixup 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 --- diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c index 3df2adc6..378ca21c 100644 --- a/liblttng-ust/lttng-ust-comm.c +++ b/liblttng-ust/lttng-ust-comm.c @@ -335,6 +335,16 @@ void lttng_fixup_ust_mutex_nest_tls(void) asm volatile ("" : : "m" (URCU_TLS(ust_mutex_nest))); } +/* + * 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; @@ -1419,6 +1429,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();