lkml.org 
[lkml]   [2012]   [Jan]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH -tip v5 2/5] perf: set correct value to perf_event_header.misc for BTS
    Date
    Set correct value to perf_event_headder.misc of BTS record
    to resolve symbols and DSOs correctly by user-space tools.

    Changes in v4:
    - Add check routine to set correct value

    Signed-off-by: Akihiro Nagai <akihiro.nagai.hw@hitachi.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Arnaldo Carvalho de Melo <acme@infradead.org>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    ---

    arch/x86/kernel/cpu/perf_event_intel_ds.c | 31 +++++++++++++++++++----------
    1 files changed, 20 insertions(+), 11 deletions(-)

    diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c
    index 73da6b6..2f99597 100644
    --- a/arch/x86/kernel/cpu/perf_event_intel_ds.c
    +++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c
    @@ -285,6 +285,18 @@ void intel_pmu_disable_bts(void)
    update_debugctlmsr(debugctlmsr);
    }

    +
    +#include <asm/insn.h>
    +
    +static inline bool kernel_ip(unsigned long ip)
    +{
    +#ifdef CONFIG_X86_32
    + return ip > PAGE_OFFSET;
    +#else
    + return (long)ip < 0;
    +#endif
    +}
    +
    int intel_pmu_drain_bts_buffer(void)
    {
    struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
    @@ -330,6 +342,14 @@ int intel_pmu_drain_bts_buffer(void)
    return 1;

    for (; at < top; at++) {
    + /*
    + * To resolve user space symbols and DSOs correctly, set
    + * PERF_RECORD_MISC_USER if from_addr or to_addr is user space.
    + */
    + if (!kernel_ip(data.ip) || !kernel_ip(data.addr)) {
    + header.misc &= ~PERF_RECORD_MISC_CPUMODE_MASK;
    + header.misc |= PERF_RECORD_MISC_USER;
    + }
    data.ip = at->from;
    data.addr = at->to;

    @@ -476,17 +496,6 @@ void intel_pmu_pebs_disable_all(void)
    wrmsrl(MSR_IA32_PEBS_ENABLE, 0);
    }

    -#include <asm/insn.h>
    -
    -static inline bool kernel_ip(unsigned long ip)
    -{
    -#ifdef CONFIG_X86_32
    - return ip > PAGE_OFFSET;
    -#else
    - return (long)ip < 0;
    -#endif
    -}
    -
    static int intel_pmu_pebs_fixup_ip(struct pt_regs *regs)
    {
    struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);


    \
     
     \ /
      Last update: 2012-01-30 05:47    [W:5.426 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site