All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH lttng-tools 1/2] Fix: filter attach vs event enable race
@ 2014-11-12 23:18 Mathieu Desnoyers
  0 siblings, 0 replies; 2+ messages in thread
From: Mathieu Desnoyers @ 2014-11-12 23:18 UTC (permalink / raw)
  To: jgalar; +Cc: lttng-dev

In order to correctly handle the use-case where events are enabled
_after_ trace is started, and _after_ applications are already being
traced, the event should be created in a "disabled" state, so that it
does not trace events until its filter is attached.

This fix needs to be done both in lttng-tools and lttng-ust. In order to
keep ABI compatibility between tools and ust within a stable release
cycle, we introduce a new "disabled" within struct lttng_ust_event
padding (previously zeroed). Newer LTTng-UST checks this flag, and
fallback on the old racy behavior (enabling the event on creation) if it
is unset.

Therefore, old session daemon works with newer lttng-ust of the same
stable release, and vice-versa. However, building lttng-tools requires
an upgraded lttng-ust, which contains the communication protocol with
the new "disabled" field.

This patch should be backported to stable-2.4, stable-2.5, stable-2.6
branches.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
---
 src/bin/lttng-sessiond/trace-ust.c |  5 +++++
 src/bin/lttng-sessiond/ust-app.c   | 27 ++++++++++++++++++++++++++-
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/src/bin/lttng-sessiond/trace-ust.c b/src/bin/lttng-sessiond/trace-ust.c
index 1f6fd52..ac980fd 100644
--- a/src/bin/lttng-sessiond/trace-ust.c
+++ b/src/bin/lttng-sessiond/trace-ust.c
@@ -419,6 +419,11 @@ struct ltt_ust_event *trace_ust_create_event(struct lttng_event *ev,
 		ERR("Unknown ust loglevel type (%d)", ev->loglevel_type);
 		goto error_free_event;
 	}
+	/*
+	 * Fix for enabler race. Enable is now done explicitly by
+	 * sessiond after setting filter.
+	 */
+	lue->attr.disabled = 1;
 
 	/* Same layout. */
 	lue->filter_expression = filter_expression;
diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c
index 5ebe991..7e4bf94 100644
--- a/src/bin/lttng-sessiond/ust-app.c
+++ b/src/bin/lttng-sessiond/ust-app.c
@@ -1446,7 +1446,32 @@ int create_ust_event(struct ust_app *app, struct ust_app_session *ua_sess,
 	}
 
 	/* If event not enabled, disable it on the tracer */
-	if (ua_event->enabled == 0) {
+	if (ua_event->enabled) {
+		/*
+		 * We now need to explicitly enable the event, since it
+		 * is now disabled at creation.
+		 */
+		ret = enable_ust_event(app, ua_sess, ua_event);
+		if (ret < 0) {
+			/*
+			 * If we hit an EPERM, something is wrong with our enable call. If
+			 * we get an EEXIST, there is a problem on the tracer side since we
+			 * just created it.
+			 */
+			switch (ret) {
+			case -LTTNG_UST_ERR_PERM:
+				/* Code flow problem */
+				assert(0);
+			case -LTTNG_UST_ERR_EXIST:
+				/* It's OK for our use case. */
+				ret = 0;
+				break;
+			default:
+				break;
+			}
+			goto error;
+		}
+	} else {
 		ret = disable_ust_event(app, ua_sess, ua_event);
 		if (ret < 0) {
 			/*
-- 
2.1.1

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH lttng-tools 1/2] Fix: filter attach vs event enable race
       [not found] <1415834313-10400-1-git-send-email-mathieu.desnoyers@efficios.com>
@ 2014-11-17 17:05 ` Jérémie Galarneau
  0 siblings, 0 replies; 2+ messages in thread
From: Jérémie Galarneau @ 2014-11-17 17:05 UTC (permalink / raw)
  To: Mathieu Desnoyers; +Cc: lttng-dev, Jeremie Galarneau

Merged all the way back to 2.4, thanks!

Jérémie

On Wed, Nov 12, 2014 at 6:18 PM, Mathieu Desnoyers
<mathieu.desnoyers@efficios.com> wrote:
> In order to correctly handle the use-case where events are enabled
> _after_ trace is started, and _after_ applications are already being
> traced, the event should be created in a "disabled" state, so that it
> does not trace events until its filter is attached.
>
> This fix needs to be done both in lttng-tools and lttng-ust. In order to
> keep ABI compatibility between tools and ust within a stable release
> cycle, we introduce a new "disabled" within struct lttng_ust_event
> padding (previously zeroed). Newer LTTng-UST checks this flag, and
> fallback on the old racy behavior (enabling the event on creation) if it
> is unset.
>
> Therefore, old session daemon works with newer lttng-ust of the same
> stable release, and vice-versa. However, building lttng-tools requires
> an upgraded lttng-ust, which contains the communication protocol with
> the new "disabled" field.
>
> This patch should be backported to stable-2.4, stable-2.5, stable-2.6
> branches.
>
> Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
> ---
>  src/bin/lttng-sessiond/trace-ust.c |  5 +++++
>  src/bin/lttng-sessiond/ust-app.c   | 27 ++++++++++++++++++++++++++-
>  2 files changed, 31 insertions(+), 1 deletion(-)
>
> diff --git a/src/bin/lttng-sessiond/trace-ust.c b/src/bin/lttng-sessiond/trace-ust.c
> index 1f6fd52..ac980fd 100644
> --- a/src/bin/lttng-sessiond/trace-ust.c
> +++ b/src/bin/lttng-sessiond/trace-ust.c
> @@ -419,6 +419,11 @@ struct ltt_ust_event *trace_ust_create_event(struct lttng_event *ev,
>                 ERR("Unknown ust loglevel type (%d)", ev->loglevel_type);
>                 goto error_free_event;
>         }
> +       /*
> +        * Fix for enabler race. Enable is now done explicitly by
> +        * sessiond after setting filter.
> +        */
> +       lue->attr.disabled = 1;
>
>         /* Same layout. */
>         lue->filter_expression = filter_expression;
> diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c
> index 5ebe991..7e4bf94 100644
> --- a/src/bin/lttng-sessiond/ust-app.c
> +++ b/src/bin/lttng-sessiond/ust-app.c
> @@ -1446,7 +1446,32 @@ int create_ust_event(struct ust_app *app, struct ust_app_session *ua_sess,
>         }
>
>         /* If event not enabled, disable it on the tracer */
> -       if (ua_event->enabled == 0) {
> +       if (ua_event->enabled) {
> +               /*
> +                * We now need to explicitly enable the event, since it
> +                * is now disabled at creation.
> +                */
> +               ret = enable_ust_event(app, ua_sess, ua_event);
> +               if (ret < 0) {
> +                       /*
> +                        * If we hit an EPERM, something is wrong with our enable call. If
> +                        * we get an EEXIST, there is a problem on the tracer side since we
> +                        * just created it.
> +                        */
> +                       switch (ret) {
> +                       case -LTTNG_UST_ERR_PERM:
> +                               /* Code flow problem */
> +                               assert(0);
> +                       case -LTTNG_UST_ERR_EXIST:
> +                               /* It's OK for our use case. */
> +                               ret = 0;
> +                               break;
> +                       default:
> +                               break;
> +                       }
> +                       goto error;
> +               }
> +       } else {
>                 ret = disable_ust_event(app, ua_sess, ua_event);
>                 if (ret < 0) {
>                         /*
> --
> 2.1.1
>



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

_______________________________________________
lttng-dev mailing list
lttng-dev@lists.lttng.org
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2014-11-17 17:06 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-11-12 23:18 [PATCH lttng-tools 1/2] Fix: filter attach vs event enable race Mathieu Desnoyers
     [not found] <1415834313-10400-1-git-send-email-mathieu.desnoyers@efficios.com>
2014-11-17 17:05 ` Jérémie Galarneau

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.