lkml.org 
[lkml]   [2017]   [Apr]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH 7/5 v3] tracing: Make sure rcu_irq_enter() can work for trace_*_rcuidle() trace events
    ----- On Apr 7, 2017, at 2:10 PM, rostedt rostedt@goodmis.org wrote:

    > From: "Steven Rostedt (VMware)" <rostedt@goodmis.org>
    >
    > Stack tracing discovered that there's a small location inside the RCU
    > infrastructure where calling rcu_irq_enter() does not work. As trace events
    > use rcu_irq_enter() it must make sure that it is functionable. A check
    > against rcu_irq_enter_disabled() is added with a WARN_ON_ONCE() as no trace
    > event should ever be used in that part of RCU. If the warning is triggered,
    > then the trace event is ignored.
    >
    > Link: http://lkml.kernel.org/r/20170405093207.404f8deb@gandalf.local.home
    >
    > Cc: Mathieu (making code boring) Desnoyers <mathieu.desnoyers@efficios.com>
    > Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    > ---
    >
    > Mathieu,
    >
    > There! Are you now satisfied?

    Since you reversed the boolean logic from my proposal, perhaps
    rename the "rcucheck" argument to "rcudisabled" to reflect the
    logic swap ?

    Other than that:

    Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>

    Thanks,

    Mathieu

    >
    >
    >
    > include/linux/tracepoint.h | 9 ++++++---
    > 1 file changed, 6 insertions(+), 3 deletions(-)
    >
    > diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
    > index f72fcfe..7f98d50 100644
    > --- a/include/linux/tracepoint.h
    > +++ b/include/linux/tracepoint.h
    > @@ -128,7 +128,7 @@ extern void syscall_unregfunc(void);
    > * as "(void *, void)". The DECLARE_TRACE_NOARGS() will pass in just
    > * "void *data", where as the DECLARE_TRACE() will pass in "void *data, proto".
    > */
    > -#define __DO_TRACE(tp, proto, args, cond, prercu, postrcu) \
    > +#define __DO_TRACE(tp, proto, args, cond, rcucheck, prercu, postrcu) \
    > do { \
    > struct tracepoint_func *it_func_ptr; \
    > void *it_func; \
    > @@ -136,6 +136,8 @@ extern void syscall_unregfunc(void);
    > \
    > if (!(cond)) \
    > return; \
    > + if (rcucheck) \
    > + return; \
    > prercu; \
    > rcu_read_lock_sched_notrace(); \
    > it_func_ptr = rcu_dereference_sched((tp)->funcs); \
    > @@ -151,7 +153,7 @@ extern void syscall_unregfunc(void);
    > } while (0)
    >
    > #ifndef MODULE
    > -#define __DECLARE_TRACE_RCU(name, proto, args, cond, data_proto, data_args) \
    > +#define __DECLARE_TRACE_RCU(name, proto, args, cond, data_proto, data_args) \
    > static inline void trace_##name##_rcuidle(proto) \
    > { \
    > if (static_key_false(&__tracepoint_##name.key)) \
    > @@ -159,6 +161,7 @@ extern void syscall_unregfunc(void);
    > TP_PROTO(data_proto), \
    > TP_ARGS(data_args), \
    > TP_CONDITION(cond), \
    > + WARN_ON_ONCE(rcu_irq_enter_disabled()),\
    > rcu_irq_enter_irqson(), \
    > rcu_irq_exit_irqson()); \
    > }
    > @@ -186,7 +189,7 @@ extern void syscall_unregfunc(void);
    > __DO_TRACE(&__tracepoint_##name, \
    > TP_PROTO(data_proto), \
    > TP_ARGS(data_args), \
    > - TP_CONDITION(cond),,); \
    > + TP_CONDITION(cond),0,,); \
    > if (IS_ENABLED(CONFIG_LOCKDEP) && (cond)) { \
    > rcu_read_lock_sched_notrace(); \
    > rcu_dereference_sched(__tracepoint_##name.funcs);\
    > --
    > 2.9.3

    --
    Mathieu Desnoyers
    EfficiOS Inc.
    http://www.efficios.com

    \
     
     \ /
      Last update: 2017-04-07 20:17    [W:2.347 / U:0.096 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site