powerpc/kprobes: Prefer ftrace when probing function entry
KPROBES_ON_FTRACE avoids much of the overhead of regular kprobes as it eliminates the need for a trap, as well as the need to emulate or single-step instructions. Though OPTPROBES provides us with similar performance, we have limited optprobes trampoline slots. As such, when asked to probe at a function entry, default to using the ftrace infrastructure. With: # cd /sys/kernel/debug/tracing # echo 'p _do_fork' > kprobe_events before patch: # cat ../kprobes/list c0000000000daf08 k _do_fork+0x8 [DISABLED] c000000000044fc0 k kretprobe_trampoline+0x0 [OPTIMIZED] and after patch: # cat ../kprobes/list c0000000000d074c k _do_fork+0xc [DISABLED][FTRACE] c0000000000412b0 k kretprobe_trampoline+0x0 [OPTIMIZED] Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
Родитель
1b32cd1715
Коммит
24bd909e94
|
@ -49,8 +49,21 @@ kprobe_opcode_t *kprobe_lookup_name(const char *name, unsigned int offset)
|
|||
#ifdef PPC64_ELF_ABI_v2
|
||||
/* PPC64 ABIv2 needs local entry point */
|
||||
addr = (kprobe_opcode_t *)kallsyms_lookup_name(name);
|
||||
if (addr && !offset)
|
||||
addr = (kprobe_opcode_t *)ppc_function_entry(addr);
|
||||
if (addr && !offset) {
|
||||
#ifdef CONFIG_KPROBES_ON_FTRACE
|
||||
unsigned long faddr;
|
||||
/*
|
||||
* Per livepatch.h, ftrace location is always within the first
|
||||
* 16 bytes of a function on powerpc with -mprofile-kernel.
|
||||
*/
|
||||
faddr = ftrace_location_range((unsigned long)addr,
|
||||
(unsigned long)addr + 16);
|
||||
if (faddr)
|
||||
addr = (kprobe_opcode_t *)faddr;
|
||||
else
|
||||
#endif
|
||||
addr = (kprobe_opcode_t *)ppc_function_entry(addr);
|
||||
}
|
||||
#elif defined(PPC64_ELF_ABI_v1)
|
||||
/*
|
||||
* 64bit powerpc ABIv1 uses function descriptors:
|
||||
|
|
Загрузка…
Ссылка в новой задаче