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.025 / U:30.056 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site