lkml.org 
[lkml]   [2010]   [Sep]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 06/11] jump label: Tracepoint support for jump labels
    From: Jason Baron <jbaron@redhat.com>

    Make use of the jump label infrastructure for tracepoints.

    Signed-off-by: Jason Baron <jbaron@redhat.com>
    LKML-Reference: <a9ba2056e2c9cf332c3c300b577463ce66ff23a8.1284733808.git.jbaron@redhat.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    ---
    include/linux/tracepoint.h | 5 ++++-
    kernel/tracepoint.c | 14 ++++++++++++--
    2 files changed, 16 insertions(+), 3 deletions(-)

    diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
    index 103d1b6..a4a90b6 100644
    --- a/include/linux/tracepoint.h
    +++ b/include/linux/tracepoint.h
    @@ -17,6 +17,7 @@
    #include <linux/errno.h>
    #include <linux/types.h>
    #include <linux/rcupdate.h>
    +#include <linux/jump_label.h>

    struct module;
    struct tracepoint;
    @@ -145,7 +146,9 @@ static inline void tracepoint_update_probe_range(struct tracepoint *begin,
    extern struct tracepoint __tracepoint_##name; \
    static inline void trace_##name(proto) \
    { \
    - if (unlikely(__tracepoint_##name.state)) \
    + JUMP_LABEL(&__tracepoint_##name.state, do_trace); \
    + return; \
    +do_trace: \
    __DO_TRACE(&__tracepoint_##name, \
    TP_PROTO(data_proto), \
    TP_ARGS(data_args)); \
    diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
    index c77f3ec..d6073a5 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[];
    @@ -263,7 +264,13 @@ static void set_tracepoint(struct tracepoint_entry **entry,
    * is used.
    */
    rcu_assign_pointer(elem->funcs, (*entry)->funcs);
    - elem->state = active;
    + if (!elem->state && active) {
    + enable_jump_label(&elem->state);
    + elem->state = active;
    + } else if (elem->state && !active) {
    + disable_jump_label(&elem->state);
    + elem->state = active;
    + }
    }

    /*
    @@ -277,7 +284,10 @@ static void disable_tracepoint(struct tracepoint *elem)
    if (elem->unregfunc && elem->state)
    elem->unregfunc();

    - elem->state = 0;
    + if (elem->state) {
    + disable_jump_label(&elem->state);
    + elem->state = 0;
    + }
    rcu_assign_pointer(elem->funcs, NULL);
    }

    --
    1.7.1



    \
     
     \ /
      Last update: 2010-09-23 05:59    [W:5.610 / U:1.452 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site