All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Javi Merino <javi.merino@arm.com>,
	David Howells <dhowells@redhat.com>,
	Ingo Molnar <mingo@kernel.org>
Subject: Re: [RFA][PATCH] tracing: Add trace_<tracepoint>_enabled() function
Date: Tue, 6 May 2014 20:53:41 +0000 (UTC)	[thread overview]
Message-ID: <799562553.12242.1399409621298.JavaMail.zimbra@efficios.com> (raw)
In-Reply-To: <20140506154845.43c7b0ad@gandalf.local.home>

----- Original Message -----
> From: "Steven Rostedt" <rostedt@goodmis.org>
> To: "Mathieu Desnoyers" <mathieu.desnoyers@efficios.com>
> Cc: "LKML" <linux-kernel@vger.kernel.org>, "Andrew Morton" <akpm@linux-foundation.org>, "Javi Merino"
> <javi.merino@arm.com>, "David Howells" <dhowells@redhat.com>, "Ingo Molnar" <mingo@kernel.org>
> Sent: Tuesday, May 6, 2014 3:48:45 PM
> Subject: Re: [RFA][PATCH] tracing: Add trace_<tracepoint>_enabled() function
> 
> On Tue, 6 May 2014 19:35:32 +0000 (UTC)
> Mathieu Desnoyers <mathieu.desnoyers@efficios.com> wrote:
> 
> 
> > I'm OK with the intend, however there seems to be two means to achieve
> > this, and I'm not sure the proposed solution is safe.
> 
> I do plan on adding more documentation to this to stress that this
> should be done like this. But hey, we're kernel developers, we should
> be responsible enough to not require the hand holding.

I like your optimism. ;-)

> Perhaps change checkpatch to make sure that any use of
> trace_tracepoint_enabled() encompasses the tracepoint.
> 
> Then again, if arg is initialized to something that the tracepoint can
> handle, that would work too.

True.

> 
> > 
> > As you point out just above, the trace_mytracepoint_enabled() construct
> > can easily lead to incorrect code if users are not very careful on how
> > they use the condition vs the tracepoint itself.
> > 
> > I understand that the reason why we cannot simply put the call
> > to "process_tp_arg()" within the parameters passed to trace_mytracepoint()
> > is because trace_mytracepoint() is a static inline, and that the
> > side-effects of the arguments it receives need to be evaluated whether
> > the tracepoint is enabled or not.
> > 
> > To overcome this issue, I have used a layer of macro on top of the
> > trace_*() call in lttng-ust, giving something similar to this:
> > 
> > #define tracepoint(name, ...)                                      \
> >         do {                                                       \
> >                 if (static_key_false(&__tracepoint_##name.key)     \
> >                         trace_##name(__VA_ARGS__);                 \
> >         } while (0)
> > 
> > and the static inline trace_##name declared by __DECLARE_TRACE
> > simply contains __DO_TRACE(&__tracepoint_##name,
> >                                 TP_PROTO(data_proto),
> >                                 TP_ARGS(data_args),
> >                                 TP_CONDITION(cond),,);
> > 
> > This allow calling a tracepoint with:
> > 
> >    tracepoint(mytracepoint, process_tp_arg());
> > 
> > making sure that process_tp_arg() will only be evaluated if
> > the tracepoint is enabled. It also ensures that it's impossible
> > to create a C construct that will open a race window where a
> > tracepoint could be called with an unpopulated parameter, such as:
> > 
> >    if (trace_mytracepoint_enabled())
> >  	arg = process_tp_arg();
> >    trace_mytracepoint(arg);
> > 
> > Thoughts ?
> > 
> 
> The first time I thought about using this was with David's code, which
> does this:
> 
> 	if (static_key_false(&i2c_trace_msg)) {
> 		int i;
> 		for (i = 0; i < ret; i++)
> 			if (msgs[i].flags & I2C_M_RD)
> 				trace_i2c_reply(adap, &msgs[i], i);
> 		trace_i2c_result(adap, i, ret);
> 	}
> 
> That would look rather silly in a tracepoint.

Which goes with a mandatory silly question: how do you intend mapping
the single key to two different tracepoints ?

Thanks,

Mathieu

> 
> -- Steve
> 

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com

  reply	other threads:[~2014-05-06 20:53 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-06 13:44 [RFA][PATCH] tracing: Add trace_<tracepoint>_enabled() function Steven Rostedt
2014-05-06 19:35 ` Mathieu Desnoyers
2014-05-06 19:48   ` Steven Rostedt
2014-05-06 20:53     ` Mathieu Desnoyers [this message]
2014-05-06 21:06       ` Steven Rostedt
2014-05-06 21:16         ` Mathieu Desnoyers
2014-05-07  3:10           ` [RFA][PATCH v2] " Steven Rostedt
2014-05-07 11:42             ` 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=799562553.12242.1399409621298.JavaMail.zimbra@efficios.com \
    --to=mathieu.desnoyers@efficios.com \
    --cc=akpm@linux-foundation.org \
    --cc=dhowells@redhat.com \
    --cc=javi.merino@arm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=rostedt@goodmis.org \
    /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.