All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Jérémie Galarneau" <jeremie.galarneau@efficios.com>
To: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: "lttng-dev@lists.lttng.org" <lttng-dev@lists.lttng.org>,
	Jeremie Galarneau <jgalar@efficios.com>
Subject: Re: [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__24711.712371982$1495638961$gmane$org@mail.gmail.com> (raw)
In-Reply-To: <1495060614-3414-1-git-send-email-mathieu.desnoyers@efficios.com>

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@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@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
_______________________________________________
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

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

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1495060614-3414-1-git-send-email-mathieu.desnoyers@efficios.com>
2017-05-24 15:12 ` Jérémie Galarneau [this message]
2017-05-17 22:36 [PATCH lttng-tools] Fix: thread exit vs futex wait/wakeup race Mathieu Desnoyers

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__24711.712371982$1495638961$gmane$org@mail.gmail.com' \
    --to=jeremie.galarneau@efficios.com \
    --cc=jgalar@efficios.com \
    --cc=lttng-dev@lists.lttng.org \
    --cc=mathieu.desnoyers@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.