From 49e614cb2878f0664c9f44f9f24cb1d81116de21 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 17 Sep 2015 12:48:40 -0400 Subject: [PATCH] Fix: relayd: don't call lttng_ht_destroy in RCU read-side C.S. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit It is forbidden to call lttng_ht_destroy() within a RCU read-side critical section. Signed-off-by: Mathieu Desnoyers Signed-off-by: Jérémie Galarneau --- src/bin/lttng-relayd/session.c | 15 ++++++++------- src/bin/lttng-relayd/stream.c | 5 +++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/bin/lttng-relayd/session.c b/src/bin/lttng-relayd/session.c index 14ae874ea..2300e5f1a 100644 --- a/src/bin/lttng-relayd/session.c +++ b/src/bin/lttng-relayd/session.c @@ -131,7 +131,14 @@ static void rcu_destroy_session(struct rcu_head *rcu_head) struct relay_session *session = caa_container_of(rcu_head, struct relay_session, rcu_node); - + /* + * Since each trace has a reference on the session, it means + * that if we are at the point where we teardown the session, no + * trace belonging to that session exist at this point. + * Calling lttng_ht_destroy in call_rcu worker thread so we + * don't hold the RCU read-side lock while calling it. + */ + lttng_ht_destroy(session->ctf_traces_ht); free(session); } @@ -155,12 +162,6 @@ static void destroy_session(struct relay_session *session) ret = session_delete(session); assert(!ret); - /* - * Since each trace has a reference on the session, it means - * that if we are at the point where we teardown the session, no - * trace belonging to that session exist at this point. - */ - lttng_ht_destroy(session->ctf_traces_ht); call_rcu(&session->rcu_node, rcu_destroy_session); } diff --git a/src/bin/lttng-relayd/stream.c b/src/bin/lttng-relayd/stream.c index b604919a7..8825d094c 100644 --- a/src/bin/lttng-relayd/stream.c +++ b/src/bin/lttng-relayd/stream.c @@ -253,6 +253,11 @@ static void stream_unpublish(struct relay_stream *stream) static void stream_destroy(struct relay_stream *stream) { if (stream->indexes_ht) { + /* + * Calling lttng_ht_destroy in call_rcu worker thread so + * we don't hold the RCU read-side lock while calling + * it. + */ lttng_ht_destroy(stream->indexes_ht); } if (stream->tfa) { -- 2.34.1