perf, trace: Fix !x86 build bug

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>
Cc: acme@redhat.com
Cc: efault@gmx.de
Cc: fweisbec@gmail.com
Cc: rostedt@goodmis.org
LKML-Reference: <1274778175.5882.623.camel@twins>
Signed-off-by: Ingo Molnar <mingo@elte.hu>

authored by Peter Zijlstra and committed by Ingo Molnar 87f44bbc d67f088e

+8 -2
+5 -1
arch/x86/kernel/cpu/perf_event.c
··· 1717 1717 */ 1718 1718 regs->bp = rewind_frame_pointer(skip + 1); 1719 1719 regs->cs = __KERNEL_CS; 1720 - local_save_flags(regs->flags); 1720 + /* 1721 + * We abuse bit 3 to pass exact information, see perf_misc_flags 1722 + * and the comment with PERF_EFLAGS_EXACT. 1723 + */ 1724 + regs->flags = 0; 1721 1725 } 1722 1726 1723 1727 unsigned long perf_instruction_pointer(struct pt_regs *regs)
+3 -1
kernel/trace/trace_event_perf.c
··· 157 157 struct pt_regs *regs, int *rctxp) 158 158 { 159 159 struct trace_entry *entry; 160 + unsigned long flags; 160 161 char *raw_data; 161 162 int pc; 162 163 ··· 175 174 memset(&raw_data[size - sizeof(u64)], 0, sizeof(u64)); 176 175 177 176 entry = (struct trace_entry *)raw_data; 178 - tracing_generic_entry_update(entry, regs->flags, pc); 177 + local_save_flags(flags); 178 + tracing_generic_entry_update(entry, flags, pc); 179 179 entry->type = type; 180 180 181 181 return raw_data;