Messages in this thread | | | Date | Wed, 5 Sep 2012 10:26:24 -0400 | From | Mathieu Desnoyers <> | Subject | Re: [PATCH] trace: Don't declare trace_*_rcuidle functions in modules |
| |
* Josh Triplett (josh@joshtriplett.org) wrote: > Tracepoints declare a static inline trace_*_rcuidle variant of the trace > function, to support safely generating trace events from the idle loop. > Module code never actually uses that variant of trace functions, because > modules don't run code that needs tracing with RCU idled. However, the > declaration of those otherwise unused functions causes the module to > reference rcu_idle_exit and rcu_idle_enter, which RCU does not export to > modules. > > To avoid this, don't generate trace_*_rcuidle functions for tracepoints > declared in module code. > > Reported-by: Steven Rostedt <rostedt@goodmis.org> > Signed-off-by: Josh Triplett <josh@joshtriplett.org>
Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thanks Josh!
Mathieu
> --- > On Tue, Sep 04, 2012 at 07:46:42PM -0400, Steven Rostedt wrote: > > We could add either. Probably keep the ugliness of tracepoints inside > > the tracepoint code than to start spreading it around to rcu. RCU has > > its own ugliness features ;-) > > > > Hence, I would be OK if you send me a patch that does what you proposed > > and removes the EXPORT from RCU. > > include/linux/tracepoint.h | 28 ++++++++++++++++++---------- > 1 file changed, 18 insertions(+), 10 deletions(-) > > diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h > index 802de56..2f322c3 100644 > --- a/include/linux/tracepoint.h > +++ b/include/linux/tracepoint.h > @@ -136,6 +136,22 @@ static inline void tracepoint_synchronize_unregister(void) > postrcu; \ > } while (0) > > +#ifndef MODULE > +#define __DECLARE_TRACE_RCU(name, proto, args, cond, data_proto, data_args) \ > + static inline void trace_##name##_rcuidle(proto) \ > + { \ > + if (static_key_false(&__tracepoint_##name.key)) \ > + __DO_TRACE(&__tracepoint_##name, \ > + TP_PROTO(data_proto), \ > + TP_ARGS(data_args), \ > + TP_CONDITION(cond), \ > + rcu_idle_exit(), \ > + rcu_idle_enter()); \ > + } > +#else > +#define __DECLARE_TRACE_RCU(name, proto, args, cond, data_proto, data_args) > +#endif > + > /* > * Make sure the alignment of the structure in the __tracepoints section will > * not add unwanted padding between the beginning of the section and the > @@ -151,16 +167,8 @@ static inline void tracepoint_synchronize_unregister(void) > TP_ARGS(data_args), \ > TP_CONDITION(cond),,); \ > } \ > - static inline void trace_##name##_rcuidle(proto) \ > - { \ > - if (static_key_false(&__tracepoint_##name.key)) \ > - __DO_TRACE(&__tracepoint_##name, \ > - TP_PROTO(data_proto), \ > - TP_ARGS(data_args), \ > - TP_CONDITION(cond), \ > - rcu_idle_exit(), \ > - rcu_idle_enter()); \ > - } \ > + __DECLARE_TRACE_RCU(name, PARAMS(proto), PARAMS(args), \ > + PARAMS(cond), PARAMS(data_proto), PARAMS(data_args)) \ > static inline int \ > register_trace_##name(void (*probe)(data_proto), void *data) \ > { \ > -- > 1.7.10.4 >
-- Mathieu Desnoyers Operating System Efficiency R&D Consultant EfficiOS Inc. http://www.efficios.com
| |