[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