lkml.org 
[lkml]   [2009]   [Sep]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 4/4] jump label - tracepoint implementation

    Implement tracepoints if conditional on top of jump labels.

    Signed-off-by: Jason Baron <jbaron@redhat.com>
    ---
    include/linux/tracepoint.h | 31 +++++++++++++++++--------------
    kernel/tracepoint.c | 10 ++++++++++
    2 files changed, 27 insertions(+), 14 deletions(-)

    diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
    index 63a3f7a..e7e2910 100644
    --- a/include/linux/tracepoint.h
    +++ b/include/linux/tracepoint.h
    @@ -16,6 +16,7 @@

    #include <linux/types.h>
    #include <linux/rcupdate.h>
    +#include <linux/jump_label.h>

    struct module;
    struct tracepoint;
    @@ -63,20 +64,22 @@ struct tracepoint {
    * not add unwanted padding between the beginning of the section and the
    * structure. Force alignment to the same alignment as the section start.
    */
    -#define DECLARE_TRACE(name, proto, args) \
    - extern struct tracepoint __tracepoint_##name; \
    - static inline void trace_##name(proto) \
    - { \
    - if (unlikely(__tracepoint_##name.state)) \
    - __DO_TRACE(&__tracepoint_##name, \
    - TP_PROTO(proto), TP_ARGS(args)); \
    - } \
    - static inline int register_trace_##name(void (*probe)(proto)) \
    - { \
    - return tracepoint_probe_register(#name, (void *)probe); \
    - } \
    - static inline int unregister_trace_##name(void (*probe)(proto)) \
    - { \
    +#define DECLARE_TRACE(name, proto, args) \
    + extern struct tracepoint __tracepoint_##name; \
    + static inline void trace_##name(proto) \
    + { \
    + JUMP_LABEL(name, trace_label, __tracepoint_##name.state);\
    + __DO_TRACE(&__tracepoint_##name, \
    + TP_PROTO(proto), TP_ARGS(args)); \
    +trace_label: \
    + return; \
    + } \
    + static inline int register_trace_##name(void (*probe)(proto)) \
    + { \
    + return tracepoint_probe_register(#name, (void *)probe); \
    + } \
    + static inline int unregister_trace_##name(void (*probe)(proto)) \
    + { \
    return tracepoint_probe_unregister(#name, (void *)probe);\
    }

    diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
    index 9489a0a..e06bce8 100644
    --- a/kernel/tracepoint.c
    +++ b/kernel/tracepoint.c
    @@ -25,6 +25,7 @@
    #include <linux/err.h>
    #include <linux/slab.h>
    #include <linux/sched.h>
    +#include <linux/jump_label.h>

    extern struct tracepoint __start___tracepoints[];
    extern struct tracepoint __stop___tracepoints[];
    @@ -256,6 +257,12 @@ static void set_tracepoint(struct tracepoint_entry **entry,
    * is used.
    */
    rcu_assign_pointer(elem->funcs, (*entry)->funcs);
    +
    + if (!elem->state && active) {
    + enable_jump_label_locked(elem->name);
    + } else if (elem->state && !active)
    + disable_jump_label_locked(elem->name);
    +
    elem->state = active;
    }

    @@ -270,6 +277,9 @@ static void disable_tracepoint(struct tracepoint *elem)
    if (elem->unregfunc && elem->state)
    elem->unregfunc();

    + if (elem->state)
    + disable_jump_label_locked(elem->name);
    +
    elem->state = 0;
    rcu_assign_pointer(elem->funcs, NULL);
    }
    --
    1.6.2.5


    \
     
     \ /
      Last update: 2009-09-25 01:21    [W:0.031 / U:29.764 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site