Mirror of the lttng-dev mailing list
 help / color / mirror / Atom feed
From: jeremie.galarneau@efficios.com (Jérémie Galarneau)
Subject: [lttng-dev] [PATCH lttng-tools] Fix: thread exit vs futex wait/wakeup race
Date: Wed, 24 May 2017 11:12:36 -0400	[thread overview]
Message-ID: <CA+jJMxs41k9betuAH79+FEtO=fFEnndRsNiR3LyUebHPfZwMCA@mail.gmail.com> (raw)
In-Reply-To: <1495060614-3414-1-git-send-email-mathieu.desnoyers@efficios.com>

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 3565 bytes --]

Merged in master, stable-2.10, stable-2.9, and stable-2.8.

Thanks!
Jérémie

On 17 May 2017 at 18:36, Mathieu Desnoyers
<mathieu.desnoyers at efficios.com> wrote:
> relayd_live_stop performs, in this order:
>
>         CMM_STORE_SHARED(live_dispatch_thread_exit, 1);   [A]
>         futex_nto1_wake(&viewer_conn_queue.futex);        [B]
>
> whereas thread_dispatcher does:
>
>    while (!CMM_LOAD_SHARED(live_dispatch_thread_exit)) {  [1]
>
>      [...]
>      futex_nto1_prepare(&viewer_conn_queue.futex);        [2]
>      [...]
>      futex_nto1_wait(&viewer_conn_queue.futex);           [3]
>
> Unfortunately, on the following sequence:
>
> [1] [A] [B] [2] [3]
>
> thread_dispatcher will end up hanging.
>
> We need to move the live_dispatch_thread_exit load between "prepare" and
> "wait" to fix this.
>
> There are similar scenarios with relay_thread_dispatcher, and the
> session daemon thread_dispatch_ust_registration, which are also fixed
> here.
>
> Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
> ---
>  src/bin/lttng-relayd/live.c   | 6 +++++-
>  src/bin/lttng-relayd/main.c   | 6 +++++-
>  src/bin/lttng-sessiond/main.c | 6 +++++-
>  3 files changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/src/bin/lttng-relayd/live.c b/src/bin/lttng-relayd/live.c
> index 61acafe..f00270b 100644
> --- a/src/bin/lttng-relayd/live.c
> +++ b/src/bin/lttng-relayd/live.c
> @@ -654,12 +654,16 @@ void *thread_dispatcher(void *data)
>
>         health_code_update();
>
> -       while (!CMM_LOAD_SHARED(live_dispatch_thread_exit)) {
> +       for (;;) {
>                 health_code_update();
>
>                 /* Atomically prepare the queue futex */
>                 futex_nto1_prepare(&viewer_conn_queue.futex);
>
> +               if (CMM_LOAD_SHARED(live_dispatch_thread_exit)) {
> +                       break;
> +               }
> +
>                 do {
>                         health_code_update();
>
> diff --git a/src/bin/lttng-relayd/main.c b/src/bin/lttng-relayd/main.c
> index 2fcc60a..0eb8e28 100644
> --- a/src/bin/lttng-relayd/main.c
> +++ b/src/bin/lttng-relayd/main.c
> @@ -977,12 +977,16 @@ static void *relay_thread_dispatcher(void *data)
>
>         health_code_update();
>
> -       while (!CMM_LOAD_SHARED(dispatch_thread_exit)) {
> +       for (;;) {
>                 health_code_update();
>
>                 /* Atomically prepare the queue futex */
>                 futex_nto1_prepare(&relay_conn_queue.futex);
>
> +               if (CMM_LOAD_SHARED(dispatch_thread_exit)) {
> +                       break;
> +               }
> +
>                 do {
>                         health_code_update();
>
> diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c
> index 9b6f70c..e282a9c 100644
> --- a/src/bin/lttng-sessiond/main.c
> +++ b/src/bin/lttng-sessiond/main.c
> @@ -1934,12 +1934,16 @@ static void *thread_dispatch_ust_registration(void *data)
>
>         DBG("[thread] Dispatch UST command started");
>
> -       while (!CMM_LOAD_SHARED(dispatch_thread_exit)) {
> +       for (;;) {
>                 health_code_update();
>
>                 /* Atomically prepare the queue futex */
>                 futex_nto1_prepare(&ust_cmd_queue.futex);
>
> +               if (CMM_LOAD_SHARED(dispatch_thread_exit)) {
> +                       break;
> +               }
> +
>                 do {
>                         struct ust_app *app = NULL;
>                         ust_cmd = NULL;
> --
> 2.1.4
>



-- 
Jérémie Galarneau
EfficiOS Inc.
http://www.efficios.com


           reply	other threads:[~2017-05-24 15:12 UTC|newest]

Thread overview: expand[flat|nested]  mbox.gz  Atom feed
 [parent not found: <1495060614-3414-1-git-send-email-mathieu.desnoyers@efficios.com>]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CA+jJMxs41k9betuAH79+FEtO=fFEnndRsNiR3LyUebHPfZwMCA@mail.gmail.com' \
    --to=jeremie.galarneau@efficios.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox