lkml.org 
[lkml]   [2010]   [May]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 01a/10] perf, trace: Fix !x86 build issue
    From
    Date
    Subject: perf, trace: Fix !x86 build issue
    From: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Date: Tue May 25 09:22:38 CEST 2010

    Patch b7e2ecef92 (perf, trace: Optimize tracepoints by removing
    IRQ-disable from perf/tracepoint interaction) made the unfortunate
    mistake of assuming the world is x86 only, correct this.

    The problem was that perf_fetch_caller_regs() did local_save_flags()
    into regs->flags, and I re-used that to remove another
    local_save_flags(), forgetting !x86 doesn't have regs->flags.

    Do the reverse, remove the local_save_flags() from
    perf_fetch_caller_regs() and let the ftrace site do the
    local_save_flags() instead.

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Acked-by: Paul Mackerras <paulus@samba.org>
    ---
    arch/x86/kernel/cpu/perf_event.c | 6 +++++-
    kernel/trace/trace_event_perf.c | 4 +++-
    2 files changed, 8 insertions(+), 2 deletions(-)

    Index: linux-2.6/arch/x86/kernel/cpu/perf_event.c
    ===================================================================
    --- linux-2.6.orig/arch/x86/kernel/cpu/perf_event.c
    +++ linux-2.6/arch/x86/kernel/cpu/perf_event.c
    @@ -1717,7 +1717,11 @@ void perf_arch_fetch_caller_regs(struct
    */
    regs->bp = rewind_frame_pointer(skip + 1);
    regs->cs = __KERNEL_CS;
    - local_save_flags(regs->flags);
    + /*
    + * We abuse bit 3 to pass exact information, see perf_misc_flags
    + * and the comment with PERF_EFLAGS_EXACT.
    + */
    + regs->flags = 0;
    }

    unsigned long perf_instruction_pointer(struct pt_regs *regs)
    Index: linux-2.6/kernel/trace/trace_event_perf.c
    ===================================================================
    --- linux-2.6.orig/kernel/trace/trace_event_perf.c
    +++ linux-2.6/kernel/trace/trace_event_perf.c
    @@ -157,6 +157,7 @@ __kprobes void *perf_trace_buf_prepare(i
    struct pt_regs *regs, int *rctxp)
    {
    struct trace_entry *entry;
    + unsigned long flags;
    char *raw_data;
    int pc;

    @@ -174,7 +175,8 @@ __kprobes void *perf_trace_buf_prepare(i
    memset(&raw_data[size - sizeof(u64)], 0, sizeof(u64));

    entry = (struct trace_entry *)raw_data;
    - tracing_generic_entry_update(entry, regs->flags, pc);
    + local_save_flags(flags);
    + tracing_generic_entry_update(entry, flags, pc);
    entry->type = type;

    return raw_data;


    \
     
     \ /
      Last update: 2010-05-25 09:33    [W:4.130 / U:0.268 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site