From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: Nicolas Pitre <nicolas.pitre@linaro.org>,
mathieu.desnoyers@polymtl.ca, peterz@infradead.org,
fweisbec@gmail.com, Nicolas Ferre <nicolas.ferre@atmel.com>,
dhowells@redhat.com, Lennert Buytenhek <kernel@wantstofly.org>,
Kevin Hilman <khilman@ti.com>, Kukjin Kim <kgene.kim@samsung.com>,
Russell King <linux@arm.linux.org.uk>,
eric.dumazet@gmail.com,
"Paul E. McKenney" <paul.mckenney@linaro.org>,
Magnus Damm <magnus.damm@gmail.com>,
Tony Lindgren <tony@atomide.com>,
dipankar@in.ibm.com, darren@dvhart.com, mingo@elte.hu,
Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com>,
Len Brown <len.brown@intel.com>,
Amit Kucheria <amit.kucheria@canonical.com>,
patches@linaro.org, Will Deacon <will.deacon@arm.com>,
josh@joshtriplett.org, Sekhar Nori <nsekhar@ti.com>,
niv@us.ibm.com, linux-samsung-soc@vger.kernel.org,
Barry Song <baohua.song@csr.com>,
tglx@linutronix.de, linux-omap@v
Subject: Re: [PATCH][RFC] tracing/rcu: Add trace_##name##__rcuidle() static tracepoint for inside rcu_idle_exit() sections
Date: Mon, 6 Feb 2012 15:38:05 -0800 [thread overview]
Message-ID: <20120206233804.GM5941@linux.vnet.ibm.com> (raw)
In-Reply-To: <1328563113.2200.39.camel@gandalf.stny.rr.com>
On Mon, Feb 06, 2012 at 04:18:33PM -0500, Steven Rostedt wrote:
> As I have said, I may find a better solution than to create a
> TRACE_EVENT_IDLE(), and I believe I have :-)
>
> A added a new static inline function that lets *any* tracepoint be used
> inside a rcu_idle_exit() section. And this also solves the problem where
> the same tracepoint may be used inside a rcu_idle_exit() section as well
> as outside of one.
>
> I added a new tracepoint function with a "_rcuidle" extension. All
> tracepoints can be used with either the normal "trace_foobar()"
> function, or the "trace_foobar_rcuidle()" function when inside a
> rcu_idle_exit() section.
>
> Ideally, this patch would be broken up into two commits. The first would
> change the tracepoint.h to introduce the new trace_foobar_rcuidle()
> static inline, and the second patch would change the power tracepoints
> to use this tracepoint function. For the RFC, I'm keeping it as a single
> patch.
>
> Another nice aspect about this patch is that "static inline"s are not
> compiled into text when not used. So only the tracepoints that actually
> use the _rcuidle() version will have them defined in the actual text
> that is booted.
>
> -- Steve
Aside from the "pre;" below needing to precede rcu_read_lock_sched_notrace()
as Josh noted, this looks reasonable to me.
Thanx, Paul
> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
>
> Index: linux-trace.git/include/linux/tracepoint.h
> ===================================================================
> --- linux-trace.git.orig/include/linux/tracepoint.h
> +++ linux-trace.git/include/linux/tracepoint.h
> @@ -114,7 +114,7 @@ static inline void tracepoint_synchroniz
> * as "(void *, void)". The DECLARE_TRACE_NOARGS() will pass in just
> * "void *data", where as the DECLARE_TRACE() will pass in "void *data, proto".
> */
> -#define __DO_TRACE(tp, proto, args, cond) \
> +#define __DO_TRACE(tp, proto, args, cond, pre, post) \
> do { \
> struct tracepoint_func *it_func_ptr; \
> void *it_func; \
> @@ -123,6 +123,7 @@ static inline void tracepoint_synchroniz
> if (!(cond)) \
> return; \
> rcu_read_lock_sched_notrace(); \
> + pre; \
> it_func_ptr = rcu_dereference_sched((tp)->funcs); \
> if (it_func_ptr) { \
> do { \
> @@ -132,6 +133,7 @@ static inline void tracepoint_synchroniz
> } while ((++it_func_ptr)->func); \
> } \
> rcu_read_unlock_sched_notrace(); \
> + post; \
> } while (0)
>
> /*
> @@ -139,7 +141,7 @@ static inline void tracepoint_synchroniz
> * not add unwanted padding between the beginning of the section and the
> * structure. Force alignment to the same alignment as the section start.
> */
> -#define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
> +#define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
> extern struct tracepoint __tracepoint_##name; \
> static inline void trace_##name(proto) \
> { \
> @@ -147,7 +149,17 @@ static inline void tracepoint_synchroniz
> __DO_TRACE(&__tracepoint_##name, \
> TP_PROTO(data_proto), \
> TP_ARGS(data_args), \
> - TP_CONDITION(cond)); \
> + TP_CONDITION(cond),,); \
> + } \
> + static inline void trace_##name##_rcuidle(proto) \
> + { \
> + if (static_branch(&__tracepoint_##name.key)) \
> + __DO_TRACE(&__tracepoint_##name, \
> + TP_PROTO(data_proto), \
> + TP_ARGS(data_args), \
> + TP_CONDITION(cond), \
> + rcu_idle_exit(), \
> + rcu_idle_enter()); \
> } \
> static inline int \
> register_trace_##name(void (*probe)(data_proto), void *data) \
> @@ -190,7 +202,7 @@ static inline void tracepoint_synchroniz
> EXPORT_SYMBOL(__tracepoint_##name)
>
> #else /* !CONFIG_TRACEPOINTS */
> -#define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
> +#define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
> static inline void trace_##name(proto) \
> { } \
> static inline int \
> Index: linux-trace.git/arch/x86/kernel/process.c
> ===================================================================
> --- linux-trace.git.orig/arch/x86/kernel/process.c
> +++ linux-trace.git/arch/x86/kernel/process.c
> @@ -377,8 +377,8 @@ static inline int hlt_use_halt(void)
> void default_idle(void)
> {
> if (hlt_use_halt()) {
> - trace_power_start(POWER_CSTATE, 1, smp_processor_id());
> - trace_cpu_idle(1, smp_processor_id());
> + trace_power_start_rcuidle(POWER_CSTATE, 1, smp_processor_id());
> + trace_cpu_idle_rcuidle(1, smp_processor_id());
> current_thread_info()->status &= ~TS_POLLING;
> /*
> * TS_POLLING-cleared state must be visible before we
> @@ -391,7 +391,7 @@ void default_idle(void)
> else
> local_irq_enable();
> current_thread_info()->status |= TS_POLLING;
> - trace_power_end(smp_processor_id());
> + trace_power_end_rcuidle(smp_processor_id());
> trace_cpu_idle(PWR_EVENT_EXIT, smp_processor_id());
> } else {
> local_irq_enable();
> @@ -450,8 +450,8 @@ EXPORT_SYMBOL_GPL(cpu_idle_wait);
> static void mwait_idle(void)
> {
> if (!need_resched()) {
> - trace_power_start(POWER_CSTATE, 1, smp_processor_id());
> - trace_cpu_idle(1, smp_processor_id());
> + trace_power_start_rcuidle(POWER_CSTATE, 1, smp_processor_id());
> + trace_cpu_idle_rcuidle(1, smp_processor_id());
> if (this_cpu_has(X86_FEATURE_CLFLUSH_MONITOR))
> clflush((void *)¤t_thread_info()->flags);
>
> @@ -461,8 +461,8 @@ static void mwait_idle(void)
> __sti_mwait(0, 0);
> else
> local_irq_enable();
> - trace_power_end(smp_processor_id());
> - trace_cpu_idle(PWR_EVENT_EXIT, smp_processor_id());
> + trace_power_end_rcuidle(smp_processor_id());
> + trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id());
> } else
> local_irq_enable();
> }
> @@ -474,13 +474,13 @@ static void mwait_idle(void)
> */
> static void poll_idle(void)
> {
> - trace_power_start(POWER_CSTATE, 0, smp_processor_id());
> - trace_cpu_idle(0, smp_processor_id());
> + trace_power_start_rcuidle(POWER_CSTATE, 0, smp_processor_id());
> + trace_cpu_idle_rcuidle(0, smp_processor_id());
> local_irq_enable();
> while (!need_resched())
> cpu_relax();
> - trace_power_end(smp_processor_id());
> - trace_cpu_idle(PWR_EVENT_EXIT, smp_processor_id());
> + trace_power_end_rcuidle(smp_processor_id());
> + trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id());
> }
>
> /*
>
>
WARNING: multiple messages have this Message-ID (diff)
From: paulmck@linux.vnet.ibm.com (Paul E. McKenney)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH][RFC] tracing/rcu: Add trace_##name##__rcuidle() static tracepoint for inside rcu_idle_exit() sections
Date: Mon, 6 Feb 2012 15:38:05 -0800 [thread overview]
Message-ID: <20120206233804.GM5941@linux.vnet.ibm.com> (raw)
In-Reply-To: <1328563113.2200.39.camel@gandalf.stny.rr.com>
On Mon, Feb 06, 2012 at 04:18:33PM -0500, Steven Rostedt wrote:
> As I have said, I may find a better solution than to create a
> TRACE_EVENT_IDLE(), and I believe I have :-)
>
> A added a new static inline function that lets *any* tracepoint be used
> inside a rcu_idle_exit() section. And this also solves the problem where
> the same tracepoint may be used inside a rcu_idle_exit() section as well
> as outside of one.
>
> I added a new tracepoint function with a "_rcuidle" extension. All
> tracepoints can be used with either the normal "trace_foobar()"
> function, or the "trace_foobar_rcuidle()" function when inside a
> rcu_idle_exit() section.
>
> Ideally, this patch would be broken up into two commits. The first would
> change the tracepoint.h to introduce the new trace_foobar_rcuidle()
> static inline, and the second patch would change the power tracepoints
> to use this tracepoint function. For the RFC, I'm keeping it as a single
> patch.
>
> Another nice aspect about this patch is that "static inline"s are not
> compiled into text when not used. So only the tracepoints that actually
> use the _rcuidle() version will have them defined in the actual text
> that is booted.
>
> -- Steve
Aside from the "pre;" below needing to precede rcu_read_lock_sched_notrace()
as Josh noted, this looks reasonable to me.
Thanx, Paul
> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
>
> Index: linux-trace.git/include/linux/tracepoint.h
> ===================================================================
> --- linux-trace.git.orig/include/linux/tracepoint.h
> +++ linux-trace.git/include/linux/tracepoint.h
> @@ -114,7 +114,7 @@ static inline void tracepoint_synchroniz
> * as "(void *, void)". The DECLARE_TRACE_NOARGS() will pass in just
> * "void *data", where as the DECLARE_TRACE() will pass in "void *data, proto".
> */
> -#define __DO_TRACE(tp, proto, args, cond) \
> +#define __DO_TRACE(tp, proto, args, cond, pre, post) \
> do { \
> struct tracepoint_func *it_func_ptr; \
> void *it_func; \
> @@ -123,6 +123,7 @@ static inline void tracepoint_synchroniz
> if (!(cond)) \
> return; \
> rcu_read_lock_sched_notrace(); \
> + pre; \
> it_func_ptr = rcu_dereference_sched((tp)->funcs); \
> if (it_func_ptr) { \
> do { \
> @@ -132,6 +133,7 @@ static inline void tracepoint_synchroniz
> } while ((++it_func_ptr)->func); \
> } \
> rcu_read_unlock_sched_notrace(); \
> + post; \
> } while (0)
>
> /*
> @@ -139,7 +141,7 @@ static inline void tracepoint_synchroniz
> * not add unwanted padding between the beginning of the section and the
> * structure. Force alignment to the same alignment as the section start.
> */
> -#define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
> +#define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
> extern struct tracepoint __tracepoint_##name; \
> static inline void trace_##name(proto) \
> { \
> @@ -147,7 +149,17 @@ static inline void tracepoint_synchroniz
> __DO_TRACE(&__tracepoint_##name, \
> TP_PROTO(data_proto), \
> TP_ARGS(data_args), \
> - TP_CONDITION(cond)); \
> + TP_CONDITION(cond),,); \
> + } \
> + static inline void trace_##name##_rcuidle(proto) \
> + { \
> + if (static_branch(&__tracepoint_##name.key)) \
> + __DO_TRACE(&__tracepoint_##name, \
> + TP_PROTO(data_proto), \
> + TP_ARGS(data_args), \
> + TP_CONDITION(cond), \
> + rcu_idle_exit(), \
> + rcu_idle_enter()); \
> } \
> static inline int \
> register_trace_##name(void (*probe)(data_proto), void *data) \
> @@ -190,7 +202,7 @@ static inline void tracepoint_synchroniz
> EXPORT_SYMBOL(__tracepoint_##name)
>
> #else /* !CONFIG_TRACEPOINTS */
> -#define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
> +#define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
> static inline void trace_##name(proto) \
> { } \
> static inline int \
> Index: linux-trace.git/arch/x86/kernel/process.c
> ===================================================================
> --- linux-trace.git.orig/arch/x86/kernel/process.c
> +++ linux-trace.git/arch/x86/kernel/process.c
> @@ -377,8 +377,8 @@ static inline int hlt_use_halt(void)
> void default_idle(void)
> {
> if (hlt_use_halt()) {
> - trace_power_start(POWER_CSTATE, 1, smp_processor_id());
> - trace_cpu_idle(1, smp_processor_id());
> + trace_power_start_rcuidle(POWER_CSTATE, 1, smp_processor_id());
> + trace_cpu_idle_rcuidle(1, smp_processor_id());
> current_thread_info()->status &= ~TS_POLLING;
> /*
> * TS_POLLING-cleared state must be visible before we
> @@ -391,7 +391,7 @@ void default_idle(void)
> else
> local_irq_enable();
> current_thread_info()->status |= TS_POLLING;
> - trace_power_end(smp_processor_id());
> + trace_power_end_rcuidle(smp_processor_id());
> trace_cpu_idle(PWR_EVENT_EXIT, smp_processor_id());
> } else {
> local_irq_enable();
> @@ -450,8 +450,8 @@ EXPORT_SYMBOL_GPL(cpu_idle_wait);
> static void mwait_idle(void)
> {
> if (!need_resched()) {
> - trace_power_start(POWER_CSTATE, 1, smp_processor_id());
> - trace_cpu_idle(1, smp_processor_id());
> + trace_power_start_rcuidle(POWER_CSTATE, 1, smp_processor_id());
> + trace_cpu_idle_rcuidle(1, smp_processor_id());
> if (this_cpu_has(X86_FEATURE_CLFLUSH_MONITOR))
> clflush((void *)¤t_thread_info()->flags);
>
> @@ -461,8 +461,8 @@ static void mwait_idle(void)
> __sti_mwait(0, 0);
> else
> local_irq_enable();
> - trace_power_end(smp_processor_id());
> - trace_cpu_idle(PWR_EVENT_EXIT, smp_processor_id());
> + trace_power_end_rcuidle(smp_processor_id());
> + trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id());
> } else
> local_irq_enable();
> }
> @@ -474,13 +474,13 @@ static void mwait_idle(void)
> */
> static void poll_idle(void)
> {
> - trace_power_start(POWER_CSTATE, 0, smp_processor_id());
> - trace_cpu_idle(0, smp_processor_id());
> + trace_power_start_rcuidle(POWER_CSTATE, 0, smp_processor_id());
> + trace_cpu_idle_rcuidle(0, smp_processor_id());
> local_irq_enable();
> while (!need_resched())
> cpu_relax();
> - trace_power_end(smp_processor_id());
> - trace_cpu_idle(PWR_EVENT_EXIT, smp_processor_id());
> + trace_power_end_rcuidle(smp_processor_id());
> + trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id());
> }
>
> /*
>
>
next prev parent reply other threads:[~2012-02-06 23:38 UTC|newest]
Thread overview: 85+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-02 0:42 [PATCH RFC idle] Make arm, sh, and x86 stop using RCU when idle Paul E. McKenney
2012-02-02 0:43 ` [PATCH RFC idle 1/3] x86: Avoid invoking RCU when CPU is idle Paul E. McKenney
2012-02-02 0:43 ` [PATCH RFC idle 2/3] arm: " Paul E. McKenney
2012-02-02 0:43 ` Paul E. McKenney
2012-02-02 2:48 ` Rob Herring
2012-02-02 2:48 ` Rob Herring
2012-02-02 4:40 ` Paul E. McKenney
2012-02-02 4:40 ` Paul E. McKenney
2012-02-02 3:49 ` Nicolas Pitre
2012-02-02 3:49 ` Nicolas Pitre
2012-02-02 4:44 ` Paul E. McKenney
2012-02-02 4:44 ` Paul E. McKenney
2012-02-02 17:13 ` Nicolas Pitre
2012-02-02 17:13 ` Nicolas Pitre
2012-02-02 17:43 ` Paul E. McKenney
2012-02-02 17:43 ` Paul E. McKenney
2012-02-02 18:31 ` Nicolas Pitre
2012-02-02 18:31 ` Nicolas Pitre
2012-02-02 19:07 ` Paul E. McKenney
2012-02-02 19:07 ` Paul E. McKenney
2012-02-02 22:20 ` Kevin Hilman
2012-02-02 22:20 ` Kevin Hilman
2012-02-02 22:49 ` Rob Herring
2012-02-02 22:49 ` Rob Herring
2012-02-02 23:03 ` Steven Rostedt
2012-02-02 23:03 ` Steven Rostedt
2012-02-02 23:27 ` Paul E. McKenney
2012-02-02 23:27 ` Paul E. McKenney
2012-02-02 23:51 ` Paul E. McKenney
2012-02-02 23:51 ` Paul E. McKenney
2012-02-03 2:45 ` Steven Rostedt
2012-02-03 2:45 ` Steven Rostedt
2012-02-03 6:04 ` Paul E. McKenney
2012-02-03 6:04 ` Paul E. McKenney
2012-02-03 18:55 ` Steven Rostedt
2012-02-03 18:55 ` Steven Rostedt
2012-02-03 19:40 ` Paul E. McKenney
2012-02-03 19:40 ` Paul E. McKenney
2012-02-03 20:02 ` Steven Rostedt
2012-02-03 20:02 ` Steven Rostedt
2012-02-03 20:23 ` Paul E. McKenney
2012-02-03 20:23 ` Paul E. McKenney
2012-02-06 21:18 ` [PATCH][RFC] tracing/rcu: Add trace_##name##__rcuidle() static tracepoint for inside rcu_idle_exit() sections Steven Rostedt
2012-02-06 21:18 ` Steven Rostedt
2012-02-06 23:38 ` Paul E. McKenney [this message]
2012-02-06 23:38 ` Paul E. McKenney
2012-02-07 12:32 ` Steven Rostedt
2012-02-07 12:32 ` Steven Rostedt
2012-02-07 14:11 ` Paul E. McKenney
2012-02-07 14:11 ` Paul E. McKenney
2012-02-08 13:57 ` Frederic Weisbecker
2012-02-08 13:57 ` Frederic Weisbecker
2012-02-07 14:40 ` Josh Triplett
2012-02-07 14:40 ` Josh Triplett
[not found] ` <20120206220502.GA21340@leaf>
2012-02-07 0:36 ` Steven Rostedt
2012-02-07 0:36 ` Steven Rostedt
2012-02-17 13:47 ` [tip:perf/core] " tip-bot for Steven Rostedt
[not found] ` <20120203025350.GF13456@leaf>
2012-02-03 6:06 ` [PATCH RFC idle 2/3] arm: Avoid invoking RCU when CPU is idle Paul E. McKenney
2012-02-03 6:06 ` Paul E. McKenney
2012-02-02 23:39 ` Rob Herring
2012-02-02 23:39 ` Rob Herring
2012-02-03 18:41 ` Kevin Hilman
2012-02-03 18:41 ` Kevin Hilman
2012-02-03 19:26 ` Paul E. McKenney
2012-02-03 19:26 ` Paul E. McKenney
2012-02-03 19:36 ` Steven Rostedt
2012-02-03 19:36 ` Steven Rostedt
2012-02-04 14:21 ` Paul E. McKenney
2012-02-04 14:21 ` Paul E. McKenney
2012-02-06 19:32 ` Steven Rostedt
2012-02-06 19:32 ` Steven Rostedt
2012-02-02 23:03 ` Paul E. McKenney
2012-02-02 23:03 ` Paul E. McKenney
2012-02-03 19:12 ` Kevin Hilman
2012-02-03 19:12 ` Kevin Hilman
2012-02-03 19:26 ` Paul E. McKenney
2012-02-03 19:26 ` Paul E. McKenney
2012-02-02 0:43 ` [PATCH RFC idle 3/3] sh: " Paul E. McKenney
2012-02-02 0:43 ` Paul E. McKenney
2012-02-02 1:54 ` [PATCH RFC idle 1/3] x86: " Frederic Weisbecker
2012-02-02 4:55 ` Paul E. McKenney
2012-02-02 0:48 ` [PATCH RFC idle] Make arm, sh, and x86 stop using RCU when idle Josh Triplett
2012-02-02 1:14 ` Paul E. McKenney
2012-02-02 2:29 ` Paul Mundt
2012-02-02 4:58 ` Paul E. McKenney
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=20120206233804.GM5941@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=amit.kucheria@canonical.com \
--cc=baohua.song@csr.com \
--cc=darren@dvhart.com \
--cc=dhowells@redhat.com \
--cc=dipankar@in.ibm.com \
--cc=eric.dumazet@gmail.com \
--cc=fweisbec@gmail.com \
--cc=josh@joshtriplett.org \
--cc=kernel@wantstofly.org \
--cc=kgene.kim@samsung.com \
--cc=khilman@ti.com \
--cc=len.brown@intel.com \
--cc=linux-omap@v \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=magnus.damm@gmail.com \
--cc=mathieu.desnoyers@polymtl.ca \
--cc=mingo@elte.hu \
--cc=nicolas.ferre@atmel.com \
--cc=nicolas.pitre@linaro.org \
--cc=niv@us.ibm.com \
--cc=nsekhar@ti.com \
--cc=patches@linaro.org \
--cc=paul.mckenney@linaro.org \
--cc=peterz@infradead.org \
--cc=plagnioj@jcrosoft.com \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=tony@atomide.com \
--cc=will.deacon@arm.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.