lkml.org 
[lkml]   [2009]   [Aug]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 03/12] add DECLARE_TRACE_WITH_CALLBACK() macro
    Introduce a new 'DECLARE_TRACE_WITH_CALLBACK()' macro, so that tracepoints can
    associate an external register/unregister function.

    Signed-off-by: Jason Baron <jbaron@redhat.com>

    ---
    include/linux/tracepoint.h | 31 +++++++++++++++++++++++++++----
    1 files changed, 27 insertions(+), 4 deletions(-)
    diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
    index b9dc4ca..5984ed0 100644
    --- a/include/linux/tracepoint.h
    +++ b/include/linux/tracepoint.h
    @@ -60,8 +60,10 @@ struct tracepoint {
    * Make sure the alignment of the structure in the __tracepoints section will
    * not add unwanted padding between the beginning of the section and the
    * structure. Force alignment to the same alignment as the section start.
    + * An optional set of (un)registration functions can be passed to perform any
    + * additional (un)registration work.
    */
    -#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,30 @@ struct tracepoint {
    } \
    static inline int register_trace_##name(void (*probe)(proto)) \
    { \
    - return tracepoint_probe_register(#name, (void *)probe); \
    + int ret; \
    + void (*func)(void) = reg; \
    + \
    + 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) = 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),\
    + NULL, NULL);
    +
    #define DEFINE_TRACE(name) \
    static const char __tpstrtab_##name[] \
    __attribute__((section("__tracepoints_strings"))) = #name; \
    @@ -94,7 +113,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 +127,10 @@ 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),\
    + NULL, NULL);
    +
    #define DEFINE_TRACE(name)
    #define EXPORT_TRACEPOINT_SYMBOL_GPL(name)
    #define EXPORT_TRACEPOINT_SYMBOL(name)
    --
    1.6.2.5


    \
     
     \ /
      Last update: 2009-08-10 22:57    [from the cache]
    ©2003-2014 Jasper Spaans. hosted at Digital Ocean