lkml.org 
[lkml]   [2009]   [Sep]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    Subject[PATCH 0/4] jump label patches

    hi,

    For background, I introduced this patchset in:
    http://marc.info/?l=linux-kernel&m=125200966226921&w=2

    This patchset updates the jump label mechanism to look like:

    #define JUMP_LABEL(tag, label, cond) \
    do { \
    static const char __jlstrtab_##tag[] \
    __used __attribute__((section("__jump_strings"))) = #tag; \
    asm goto ("1:" \
    "jmp %l[" #label "] \n\t" \
    ".pushsection __jump_table, \"a\" \n\t" \
    _ASM_PTR "1b, %l[" #label "], %c0, 0 \n\t" \
    ".popsection \n\t" \
    : : "i" (__jlstrtab_##tag) : : label); \
    } while (0)

    #endif


    and usage case is:

    #define DECLARE_TRACE(name, proto, args) \
    extern struct tracepoint __tracepoint_##name; \
    static inline void trace_##name(proto) \
    { \
    JUMP_LABEL(name, trace_label, __tracepoint_##name.state);\
    __DO_TRACE(&__tracepoint_##name, \
    TP_PROTO(proto), TP_ARGS(args)); \
    trace_label: \
    return; \
    } \


    So the idea now, is that by default we jump over the disabled code. In order to
    enable the 'disabled' code, or tracing, we simply replace the jump with a
    'jump 0'. Thus, we now avoid the issue of not having enough instruction space.
    Thus, in most cases the jump we are patching is an '0xeb' opcode which is
    simply 2 bytes (occasionally its an 0xeb). I have this patchset working nicely
    on x86_64. I'm not sure if we need to recognize additional jump opcodes for
    x86 32-bit....I have not yet tested there. In my x86_64 testing under memory
    pressure I saw about a 30 cycle improvement with this code per tracepoint.
    Additionally, this code reduces the icache bytes from 9 bytes (cmpl; je), to
    just 2 bytes (jmp).

    The patchset makes use of text_poke_fixup() interface introduced by Masami in:
    http://marc.info/?l=linux-kernel&m=125297186224609&w=2.

    Thus, that patchset needs to be applied first. Patch is against the latest -tip
    tree.

    thanks,

    -Jason



    arch/x86/include/asm/jump_label.h | 27 +++++++++++
    arch/x86/kernel/Makefile | 2 +-
    arch/x86/kernel/jump_label.c | 94 +++++++++++++++++++++++++++++++++++++
    include/asm-generic/vmlinux.lds.h | 11 ++++
    include/linux/jump_label.h | 71 ++++++++++++++++++++++++++++
    include/linux/kernel.h | 1 +
    include/linux/module.h | 12 ++++-
    include/linux/tracepoint.h | 31 +++++++------
    kernel/extable.c | 2 +-
    kernel/module.c | 31 ++++++++++++
    kernel/tracepoint.c | 10 ++++
    11 files changed, 275 insertions(+), 17 deletions(-)
    create mode 100644 arch/x86/include/asm/jump_label.h
    create mode 100644 arch/x86/kernel/jump_label.c
    create mode 100644 include/linux/jump_label.h



    \
     
     \ /
      Last update: 2009-09-25 01:21    [W:0.022 / U:0.556 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site