[PATCH 7/7] perf: Correctly align perf event tracing buffer

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Frederic Weisbecker
Date: Thursday, March 25, 2010 - 6:52 pm

The trace event buffer used by perf to record raw sample events
is typed as an array of char and may then not be aligned to 8
by alloc_percpu().

But we need it to be aligned to 8 in sparc64 because we cast
this buffer into a random structure type built by the TRACE_EVENT()
macro to store the traces. So if a random 64 bits field is accessed
inside, it may be not under an expected good alignment.

Use an array of long instead to force the appropriate alignment, and
perform a compile time check to ensure the size in byte of the buffer
is a multiple of sizeof(long) so that its actual size doesn't get
shrinked under us.

This fixes unaligned accesses reported while using perf lock
in sparc 64.

Suggested-by: David Miller <davem@davemloft.net>
Suggested-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: David Miller <davem@davemloft.net>
Cc: Tejun Heo <htejun@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
 kernel/trace/trace_event_perf.c |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c
index 8e9edcd..30314f5 100644
--- a/kernel/trace/trace_event_perf.c
+++ b/kernel/trace/trace_event_perf.c
@@ -15,7 +15,12 @@ EXPORT_PER_CPU_SYMBOL_GPL(perf_trace_regs);
 static char *perf_trace_buf;
 static char *perf_trace_buf_nmi;
 
-typedef typeof(char [PERF_MAX_TRACE_SIZE]) perf_trace_t ;
+/*
+ * Force it to be aligned to unsigned long to avoid misaligned accesses
+ * suprises
+ */
+typedef typeof(unsigned long [PERF_MAX_TRACE_SIZE / sizeof(unsigned long)])
+	perf_trace_t;
 
 /* Count the events in use (per event id, not per instance) */
 static int	total_ref_count;
@@ -128,6 +133,8 @@ __kprobes void *perf_trace_buf_prepare(int size, unsigned short type,
 	char *trace_buf, *raw_data;
 	int pc, cpu;
 
+	BUILD_BUG_ON(PERF_MAX_TRACE_SIZE % sizeof(unsigned long));
+
 	pc = preempt_count();
 
 	/* Protect the per cpu buffer, begin the rcu read side */
@@ -150,7 +157,7 @@ __kprobes void *perf_trace_buf_prepare(int size, unsigned short type,
 	raw_data = per_cpu_ptr(trace_buf, cpu);
 
 	/* zero the dead bytes from align to not leak stack to user */
-	*(u64 *)(&raw_data[size - sizeof(u64)]) = 0ULL;
+	memset(&raw_data[size - sizeof(u64)], 0, sizeof(u64));
 
 	entry = (struct trace_entry *)raw_data;
 	tracing_generic_entry_update(entry, *irq_flags, pc);
-- 
1.6.2.3

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 0/7] perf updates and fixes, Frederic Weisbecker, (Thu Mar 25, 6:52 pm)
[PATCH 1/7] perf: Drop the frame reliablity check, Frederic Weisbecker, (Thu Mar 25, 6:52 pm)
[PATCH 2/7] perf: Fetch hot regs from the template caller, Frederic Weisbecker, (Thu Mar 25, 6:52 pm)
[PATCH 3/7] x86: Unify dumpstack.h and stacktrace.h, Frederic Weisbecker, (Thu Mar 25, 6:52 pm)
[PATCH 4/7] perf: Move perf_arch_fetch_caller_regs into a ..., Frederic Weisbecker, (Thu Mar 25, 6:52 pm)
[PATCH 5/7] perf: Make perf_fetch_caller_regs rewind to th ..., Frederic Weisbecker, (Thu Mar 25, 6:52 pm)
[PATCH 6/7] perf: Use hot regs with software sched/migrate ..., Frederic Weisbecker, (Thu Mar 25, 6:52 pm)
[PATCH 7/7] perf: Correctly align perf event tracing buffer, Frederic Weisbecker, (Thu Mar 25, 6:52 pm)
Re: [PATCH 0/7] perf updates and fixes, Paul Mackerras, (Thu Mar 25, 11:02 pm)
Re: [PATCH 0/7] perf updates and fixes, Ingo Molnar, (Fri Mar 26, 12:58 am)
Re: [PATCH 0/7] perf updates and fixes, Frederic Weisbecker, (Fri Mar 26, 10:38 am)
Re: [PATCH 0/7] perf updates and fixes, Frederic Weisbecker, (Fri Mar 26, 10:45 am)
Re: [BUG perf] perf_fetch_caller_regs / rewind_frame_point ..., Frederic Weisbecker, (Thu Apr 8, 3:59 am)
[PATCH] perf: Fix unsafe frame rewinding with hot regs fet ..., Frederic Weisbecker, (Thu Apr 8, 5:32 am)
[GIT PULL] perf fix, Frederic Weisbecker, (Thu Apr 8, 10:31 am)
Re: [GIT PULL] perf fix, Ingo Molnar, (Tue Apr 13, 3:51 pm)