[lttng-dev] [PATCH lttng-tools 1/2] Fix: relayd: don't call lttng_ht_destroy in RCU read-side C.S.

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Thu Sep 17 12:48:40 EDT 2015


It is forbidden to call lttng_ht_destroy() within a RCU read-side
critical section.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
---
 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 14ae874..2300e5f 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 b604919..8825d09 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.1.4




More information about the lttng-dev mailing list