From: Mathieu Desnoyers Date: Mon, 12 Jan 2015 18:27:53 +0000 (-0500) Subject: Fix: add urcu-bp TLS fixup X-Git-Tag: v2.6.0~4 X-Git-Url: http://git.liburcu.org/?p=lttng-ust.git;a=commitdiff_plain;h=3df53fae30ba42a0ce6f61054fe38b15f13ceeb6 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();