lkml.org 
[lkml]   [2017]   [Feb]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/3] powerpc: kprobes: prefer ftrace when probing function entry
    Date
    KPROBES_ON_FTRACE avoids much of the overhead with 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>
    ---
    arch/powerpc/include/asm/kprobes.h | 20 ++++++++++++++++++++
    1 file changed, 20 insertions(+)

    diff --git a/arch/powerpc/include/asm/kprobes.h b/arch/powerpc/include/asm/kprobes.h
    index 3305a12286fa..09e74edee625 100644
    --- a/arch/powerpc/include/asm/kprobes.h
    +++ b/arch/powerpc/include/asm/kprobes.h
    @@ -60,12 +60,32 @@ extern kprobe_opcode_t optprobe_template_end[];

    #ifdef PPC64_ELF_ABI_v2
    /* PPC64 ABIv2 needs local entry point */
    +#ifdef CONFIG_KPROBES_ON_FTRACE
    +/*
    + * Per livepatch.h, ftrace location is always within the first 16 bytes
    + * of a function on powerpc with -mprofile-kernel.
    + */
    +#define kprobe_lookup_name(name, addr, offset) \
    +{ \
    + addr = (kprobe_opcode_t *)kallsyms_lookup_name(name); \
    + if (addr && !(offset)) { \
    + unsigned long faddr; \
    + faddr = ftrace_location_range((unsigned long)addr, \
    + (unsigned long)addr + 16);\
    + if (faddr) \
    + addr = (kprobe_opcode_t *)faddr; \
    + else \
    + addr = (kprobe_opcode_t *)ppc_function_entry(addr); \
    + } \
    +}
    +#else
    #define kprobe_lookup_name(name, addr, offset) \
    { \
    addr = (kprobe_opcode_t *)kallsyms_lookup_name(name); \
    if (addr && !(offset)) \
    addr = (kprobe_opcode_t *)ppc_function_entry(addr); \
    }
    +#endif
    #elif defined(PPC64_ELF_ABI_v1)
    /*
    * 64bit powerpc ABIv1 uses function descriptors:
    --
    2.11.0
    \
     
     \ /
      Last update: 2017-02-14 20:01    [W:2.643 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site