perf/ftrace: Add recursion protection to the ftrace callback
If a ftrace callback does not supply its own recursion protection and does not set the RECURSION_SAFE flag in its ftrace_ops, then ftrace will make a helper trampoline to do so before calling the callback instead of just calling the callback directly. The default for ftrace_ops is going to change. It will expect that handlers provide their own recursion protection, unless its ftrace_ops states otherwise. Link: https://lkml.kernel.org/r/20201028115613.444477858@goodmis.org Link: https://lkml.kernel.org/r/20201106023547.466892083@goodmis.org Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Jiri Kosina <jikos@kernel.org> Cc: Miroslav Benes <mbenes@suse.cz> Cc: Petr Mladek <pmladek@suse.com> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Jiri Olsa <jolsa@redhat.com> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
parent
4b750b573c
commit
5d15a624c3
@ -439,10 +439,15 @@ perf_ftrace_function_call(unsigned long ip, unsigned long parent_ip,
|
|||||||
struct hlist_head head;
|
struct hlist_head head;
|
||||||
struct pt_regs regs;
|
struct pt_regs regs;
|
||||||
int rctx;
|
int rctx;
|
||||||
|
int bit;
|
||||||
|
|
||||||
if ((unsigned long)ops->private != smp_processor_id())
|
if ((unsigned long)ops->private != smp_processor_id())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
bit = ftrace_test_recursion_trylock();
|
||||||
|
if (bit < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
event = container_of(ops, struct perf_event, ftrace_ops);
|
event = container_of(ops, struct perf_event, ftrace_ops);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -463,13 +468,15 @@ perf_ftrace_function_call(unsigned long ip, unsigned long parent_ip,
|
|||||||
|
|
||||||
entry = perf_trace_buf_alloc(ENTRY_SIZE, NULL, &rctx);
|
entry = perf_trace_buf_alloc(ENTRY_SIZE, NULL, &rctx);
|
||||||
if (!entry)
|
if (!entry)
|
||||||
return;
|
goto out;
|
||||||
|
|
||||||
entry->ip = ip;
|
entry->ip = ip;
|
||||||
entry->parent_ip = parent_ip;
|
entry->parent_ip = parent_ip;
|
||||||
perf_trace_buf_submit(entry, ENTRY_SIZE, rctx, TRACE_FN,
|
perf_trace_buf_submit(entry, ENTRY_SIZE, rctx, TRACE_FN,
|
||||||
1, ®s, &head, NULL);
|
1, ®s, &head, NULL);
|
||||||
|
|
||||||
|
out:
|
||||||
|
ftrace_test_recursion_unlock(bit);
|
||||||
#undef ENTRY_SIZE
|
#undef ENTRY_SIZE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user