From: Jérémie Galarneau Date: Fri, 18 May 2018 19:08:14 +0000 (-0400) Subject: Fix: perform the initialization memory barrier out of loop body X-Git-Tag: v2.11.0-rc1~231 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=8b0d46366f5c87043d22aa29b9f26e5249bf7c3a Fix: perform the initialization memory barrier out of loop body The memory barrier used by the client thread should be performed after the lttng_sessiond_ready counter has been seen to have reached zero. This ensures that loads are not speculatively performed before this point as the thread will interact with data structures initialized by the support threads for which it was waiting for the initialization to complete. See the comment as to why this read barrier is promoted to a full barrier. Signed-off-by: Jérémie Galarneau --- diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c index 9c2458eb1..3d2cad936 100644 --- a/src/bin/lttng-sessiond/main.c +++ b/src/bin/lttng-sessiond/main.c @@ -4574,8 +4574,17 @@ static void *thread_manage_clients(void *data) if (ret > 0 || (ret < 0 && errno != EINTR)) { goto exit; } - cmm_smp_rmb(); } + /* + * This barrier is paired with the one in sessiond_notify_ready() to + * ensure that loads accessing data initialized by the other threads, + * on which this thread was waiting, are not performed before this point. + * + * Note that this could be a 'read' memory barrier, but a full barrier + * is used in case the code changes. The performance implications of + * this choice are minimal since this is a slow path. + */ + cmm_smp_mb(); /* This testpoint is after we signal readiness to the parent. */ if (testpoint(sessiond_thread_manage_clients)) {