From 3df53fae30ba42a0ce6f61054fe38b15f13ceeb6 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 12 Jan 2015 13:27:53 -0500 Subject: [PATCH] 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 --- liblttng-ust/lttng-ust-comm.c | 11 +++++++++++ 1 file changed, 11 insertions(+) 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(); -- 2.34.1