Messages in this thread Patch in this message | | | Date | Tue, 1 Dec 2015 11:56:55 -0500 | From | Steven Rostedt <> | Subject | Re: [PATCH] ftrace: Remove use of control list and ops |
| |
On Tue, 1 Dec 2015 16:57:44 +0100 Jiri Olsa <jolsa@redhat.com> wrote:
> > Hmm, I thought that I forced the list function when RCU or PER_CPU > > was set. Oh wait. I have CONFIG_PREEMPT set, which will change the > > logic slightly. I'm guessing you have PREEMPT_VOLUNTARY set. I'll try > > that out. > > yep, but the trampoline has separate code path > to set the ops func
Right, but that only gets called for DYNAMIC ops (which perf is) when CONFIG_PREEMPT is not set. What about this patch instead? (on top of my other one)
It's a lot like yours, but instead of creating a new helper function, I just reuse the recurs_func instead.
-- Steve
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 8b22e681baf8..05ed87d06bb0 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -5230,20 +5230,29 @@ static void ftrace_ops_no_ops(unsigned long ip, unsigned long parent_ip) /* * If there's only one function registered but it does not support - * recursion, this function will be called by the mcount trampoline. - * This function will handle recursion protection. + * recursion, needs RCU protection and/or requires per cpu handling, then + * this function will be called by the mcount trampoline. */ -static void ftrace_ops_recurs_func(unsigned long ip, unsigned long parent_ip, +static void ftrace_ops_assist_func(unsigned long ip, unsigned long parent_ip, struct ftrace_ops *op, struct pt_regs *regs) { int bit; + if ((op->flags & FTRACE_OPS_FL_RCU) && !rcu_is_watching()) + return; + bit = trace_test_and_set_recursion(TRACE_LIST_START, TRACE_LIST_MAX); if (bit < 0) return; - op->func(ip, parent_ip, op, regs); + preempt_disable_notrace(); + if (!(op->flags & FTRACE_OPS_FL_PER_CPU) || + ftrace_function_local_disabled(op)) { + op->func(ip, parent_ip, op, regs); + } + + preempt_enable_notrace(); trace_clear_recursion(bit); } @@ -5261,12 +5270,12 @@ static void ftrace_ops_recurs_func(unsigned long ip, unsigned long parent_ip, ftrace_func_t ftrace_ops_get_func(struct ftrace_ops *ops) { /* - * If the func handles its own recursion, call it directly. - * Otherwise call the recursion protected function that - * will call the ftrace ops function. + * If the function does not handle recursion, needs to be RCU safe, + * or does per cpu logic, then we need to call the assist handler. */ - if (!(ops->flags & FTRACE_OPS_FL_RECURSION_SAFE)) - return ftrace_ops_recurs_func; + if (!(ops->flags & FTRACE_OPS_FL_RECURSION_SAFE) || + ops->flags & (FTRACE_OPS_FL_RCU | FTRACE_OPS_FL_PER_CPU)) + return ftrace_ops_assist_func; return ops->func; }
| |