lkml.org 
[lkml]   [2009]   [Jun]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [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)
>
>



\
 
 \ /
  Last update: 2009-06-25 06:51    [W:0.053 / U:0.116 seconds]
©2003-2014 Jasper Spaans. hosted at Digital Ocean