Use immediate values in tracepoints. Signed-off-by: Mathieu Desnoyers CC: 'Peter Zijlstra' CC: "Frank Ch. Eigler" CC: 'Ingo Molnar' CC: 'Hideo AOKI' CC: Takashi Nishiie CC: 'Steven Rostedt' --- include/linux/tracepoint.h | 33 +++++++++++++++++++++++++++------ kernel/tracepoint.c | 14 +++++++++----- 2 files changed, 36 insertions(+), 11 deletions(-) Index: linux.trees.git/include/linux/tracepoint.h =================================================================== --- linux.trees.git.orig/include/linux/tracepoint.h 2009-09-24 08:52:55.000000000 -0400 +++ linux.trees.git/include/linux/tracepoint.h 2009-09-24 09:05:29.000000000 -0400 @@ -14,6 +14,7 @@ * See the file COPYING for more details. */ +#include #include #include @@ -22,7 +23,7 @@ struct tracepoint; struct tracepoint { const char *name; /* Tracepoint name */ - int state; /* State. */ + DEFINE_IMV(char, state); /* State. */ void (*regfunc)(void); void (*unregfunc)(void); void **funcs; @@ -58,18 +59,38 @@ struct tracepoint { rcu_read_unlock_sched_notrace(); \ } while (0) +#define __CHECK_TRACE(name, generic, proto, args) \ + do { \ + if (!generic) { \ + if (unlikely(imv_read(__tracepoint_##name.state))) \ + __DO_TRACE(&__tracepoint_##name, \ + TP_PROTO(proto), TP_ARGS(args));\ + } else { \ + if (unlikely(_imv_read(__tracepoint_##name.state))) \ + __DO_TRACE(&__tracepoint_##name, \ + TP_PROTO(proto), TP_ARGS(args));\ + } \ + } while (0) + /* * 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. + * + * The "generic" argument, passed to the declared __trace_##name inline + * function controls which tracepoint enabling mechanism must be used. + * If generic is true, a variable read is used. + * If generic is false, immediate values are used. */ #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)); \ + __CHECK_TRACE(name, 0, TP_PROTO(proto), TP_ARGS(args)); \ + } \ + static inline void _trace_##name(proto) \ + { \ + __CHECK_TRACE(name, 1, TP_PROTO(proto), TP_ARGS(args)); \ } \ static inline int register_trace_##name(void (*probe)(proto)) \ { \ @@ -101,10 +122,10 @@ extern void tracepoint_update_probe_rang #else /* !CONFIG_TRACEPOINTS */ #define DECLARE_TRACE(name, proto, args) \ - static inline void _do_trace_##name(struct tracepoint *tp, proto) \ - { } \ static inline void trace_##name(proto) \ { } \ + static inline void _trace_##name(proto) \ + { } \ static inline int register_trace_##name(void (*probe)(proto)) \ { \ return -ENOSYS; \ Index: linux.trees.git/kernel/tracepoint.c =================================================================== --- linux.trees.git.orig/kernel/tracepoint.c 2009-09-24 08:52:55.000000000 -0400 +++ linux.trees.git/kernel/tracepoint.c 2009-09-24 09:11:13.000000000 -0400 @@ -25,6 +25,7 @@ #include #include #include +#include extern struct tracepoint __start___tracepoints[]; extern struct tracepoint __stop___tracepoints[]; @@ -243,9 +244,9 @@ static void set_tracepoint(struct tracep { WARN_ON(strcmp((*entry)->name, elem->name) != 0); - if (elem->regfunc && !elem->state && active) + if (elem->regfunc && !_imv_read(elem->state) && active) elem->regfunc(); - else if (elem->unregfunc && elem->state && !active) + else if (elem->unregfunc && _imv_read(elem->state) && !active) elem->unregfunc(); /* @@ -256,7 +257,7 @@ static void set_tracepoint(struct tracep * is used. */ rcu_assign_pointer(elem->funcs, (*entry)->funcs); - elem->state = active; + elem->state__imv = active; } /* @@ -267,10 +268,10 @@ static void set_tracepoint(struct tracep */ static void disable_tracepoint(struct tracepoint *elem) { - if (elem->unregfunc && elem->state) + if (elem->unregfunc && _imv_read(elem->state)) elem->unregfunc(); - elem->state = 0; + elem->state__imv = 0; rcu_assign_pointer(elem->funcs, NULL); } @@ -313,6 +314,9 @@ static void tracepoint_update_probes(voi __stop___tracepoints); /* tracepoints in modules. */ module_update_tracepoints(); + /* Update immediate values */ + core_imv_update(); + module_imv_update(); } static void *tracepoint_add_probe(const char *name, void *probe) -- Mathieu Desnoyers OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/