Commit 4346ba16 authored by Masami Hiramatsu (Google)'s avatar Masami Hiramatsu (Google) Committed by Steven Rostedt (Google)
Browse files

fprobe: Rewrite fprobe on function-graph tracer



Rewrite fprobe implementation on function-graph tracer.
Major API changes are:
 -  'nr_maxactive' field is deprecated.
 -  This depends on CONFIG_DYNAMIC_FTRACE_WITH_ARGS or
    !CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS, and
    CONFIG_HAVE_FUNCTION_GRAPH_FREGS. So currently works only
    on x86_64.
 -  Currently the entry size is limited in 15 * sizeof(long).
 -  If there is too many fprobe exit handler set on the same
    function, it will fail to probe.

Signed-off-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
Acked-by: Heiko Carstens <hca@linux.ibm.com> # s390
Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>
Cc: Florent Revest <revest@chromium.org>
Cc: Martin KaFai Lau <martin.lau@linux.dev>
Cc: bpf <bpf@vger.kernel.org>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Alan Maguire <alan.maguire@oracle.com>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: Huacai Chen <chenhuacai@kernel.org>
Cc: WANG Xuerui <kernel@xen0n.name>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
Cc: Naveen N Rao <naveen@kernel.org>
Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
Cc: Paul Walmsley <paul.walmsley@sifive.com>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: Albert Ou <aou@eecs.berkeley.edu>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: Alexander Gordeev <agordeev@linux.ibm.com>
Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
Cc: Sven Schnelle <svens@linux.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: x86@kernel.org
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Link: https://lore.kernel.org/173519003970.391279.14406792285453830996.stgit@devnote2


Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
parent 7495e179
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -135,6 +135,12 @@ ftrace_regs_get_frame_pointer(const struct ftrace_regs *fregs)
	return arch_ftrace_regs(fregs)->fp;
}

static __always_inline unsigned long
ftrace_regs_get_return_address(const struct ftrace_regs *fregs)
{
	return arch_ftrace_regs(fregs)->lr;
}

static __always_inline struct pt_regs *
ftrace_partial_regs(const struct ftrace_regs *fregs, struct pt_regs *regs)
{
+6 −0
Original line number Diff line number Diff line
@@ -61,6 +61,12 @@ ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs, unsigned long ip)
#define ftrace_regs_get_frame_pointer(fregs) \
	(arch_ftrace_regs(fregs)->regs.regs[22])

static __always_inline unsigned long
ftrace_regs_get_return_address(struct ftrace_regs *fregs)
{
	return *(unsigned long *)(arch_ftrace_regs(fregs)->regs.regs[1]);
}

#define ftrace_graph_func ftrace_graph_func
void ftrace_graph_func(unsigned long ip, unsigned long parent_ip,
		       struct ftrace_ops *op, struct ftrace_regs *fregs);
+6 −0
Original line number Diff line number Diff line
@@ -57,6 +57,12 @@ ftrace_regs_set_instruction_pointer(struct ftrace_regs *fregs,
	regs_set_return_ip(&arch_ftrace_regs(fregs)->regs, ip);
}

static __always_inline unsigned long
ftrace_regs_get_return_address(struct ftrace_regs *fregs)
{
	return arch_ftrace_regs(fregs)->regs.link;
}

struct ftrace_ops;

#define ftrace_graph_func ftrace_graph_func
+5 −0
Original line number Diff line number Diff line
@@ -186,6 +186,11 @@ static __always_inline unsigned long ftrace_regs_get_return_value(const struct f
	return arch_ftrace_regs(fregs)->a0;
}

static __always_inline unsigned long ftrace_regs_get_return_address(const struct ftrace_regs *fregs)
{
	return arch_ftrace_regs(fregs)->ra;
}

static __always_inline void ftrace_regs_set_return_value(struct ftrace_regs *fregs,
							 unsigned long ret)
{
+6 −0
Original line number Diff line number Diff line
@@ -77,6 +77,12 @@ ftrace_regs_get_frame_pointer(struct ftrace_regs *fregs)
	return ftrace_regs_get_stack_pointer(fregs);
}

static __always_inline unsigned long
ftrace_regs_get_return_address(const struct ftrace_regs *fregs)
{
	return arch_ftrace_regs(fregs)->regs.gprs[14];
}

#define arch_ftrace_fill_perf_regs(fregs, _regs)	 do {		\
		(_regs)->psw.mask = 0;					\
		(_regs)->psw.addr = arch_ftrace_regs(fregs)->regs.psw.addr;		\
Loading