[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20090625044722.GA6071@nowhere>
Date: Thu, 25 Jun 2009 06:47:23 +0200
From: Frederic Weisbecker <fweisbec@...il.com>
To: Li Zefan <lizf@...fujitsu.com>
Cc: Jason Baron <jbaron@...hat.com>, linux-kernel@...r.kernel.org,
mingo@...e.hu, laijs@...fujitsu.com, rostedt@...dmis.org,
peterz@...radead.org, mathieu.desnoyers@...ymtl.ca,
jiayingz@...gle.com, mbligh@...gle.com, roland@...hat.com,
fche@...hat.com
Subject: Re: [PATCH 3/7] V2 add syscall tracepoints
On Thu, Jun 25, 2009 at 10:20:41AM +0800, Li Zefan wrote:
> > -#define DECLARE_TRACE(name, proto, args) \
> > +#define DECLARE_TRACE_WITH_CALLBACK(name, proto, args, reg, unreg) \
> > extern struct tracepoint __tracepoint_##name; \
> > static inline void trace_##name(proto) \
> > { \
> > @@ -71,13 +73,29 @@ struct tracepoint {
> > } \
> > static inline int register_trace_##name(void (*probe)(proto)) \
> > { \
> > - return tracepoint_probe_register(#name, (void *)probe); \
> > + int ret; \
> > + void (*func)(void) = (void (*)(void))reg; \
>
> The explicit cast seems unnecessary.
It seems even dangerous.
That might hide unmatching callback types passed in macro
arguments.
Frederic.
> > + \
> > + ret = tracepoint_probe_register(#name, (void *)probe); \
> > + if (func && !ret) \
> > + func(); \
> > + return ret; \
> > } \
> > static inline int unregister_trace_##name(void (*probe)(proto)) \
> > { \
> > - return tracepoint_probe_unregister(#name, (void *)probe);\
> > + int ret; \
> > + void (*func)(void) = (void (*)(void))unreg; \
> > + \
> > + ret = tracepoint_probe_unregister(#name, (void *)probe);\
> > + if (func && !ret) \
> > + func(); \
> > + return ret; \
> > }
> >
> > +
> > +#define DECLARE_TRACE(name, proto, args) \
> > + DECLARE_TRACE_WITH_CALLBACK(name, TP_PROTO(proto), TP_ARGS(args), 0, 0);
>
> I think DECLARE_TRACE_WITH_CALLBACK(..., NULL, NULL) is better.
>
> > +
> > #define DEFINE_TRACE(name) \
> > static const char __tpstrtab_##name[] \
> > __attribute__((section("__tracepoints_strings"))) = #name; \
> > @@ -94,7 +112,7 @@ extern void tracepoint_update_probe_range(struct tracepoint *begin,
> > struct tracepoint *end);
> >
> > #else /* !CONFIG_TRACEPOINTS */
> > -#define DECLARE_TRACE(name, proto, args) \
> > +#define DECLARE_TRACE_WITH_CALLBACK(name, proto, args, reg, unreg) \
> > static inline void _do_trace_##name(struct tracepoint *tp, proto) \
> > { } \
> > static inline void trace_##name(proto) \
> > @@ -108,6 +126,9 @@ extern void tracepoint_update_probe_range(struct tracepoint *begin,
> > return -ENOSYS; \
> > }
> >
> > +#define DECLARE_TRACE(name, proto, args) \
> > + DECLARE_TRACE_WITH_CALLBACK(name, TP_PROTO(proto), TP_ARGS(args), 0, 0);
>
> ditto
>
> > +
> > #define DEFINE_TRACE(name)
> > #define EXPORT_TRACEPOINT_SYMBOL_GPL(name)
> > #define EXPORT_TRACEPOINT_SYMBOL(name)
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists