1
linux/kernel/trace
Steven Rostedt 2271048d1b ring-buffer: Do 8 byte alignment for 64 bit that can not handle 4 byte align
The ring buffer uses 4 byte alignment while recording events into the
buffer, even on 64bit machines. This saves space when there are lots
of events being recorded at 4 byte boundaries.

The ring buffer has a zero copy method to write into the buffer, with
the reserving of space and then committing it. This may cause problems
when writing an 8 byte word into a 4 byte alignment (not 8). For x86 and
PPC this is not an issue, but on some architectures this would cause an
out-of-alignment exception.

This patch uses CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS to determine
if it is OK to use 4 byte alignments on 64 bit machines. If it is not,
it forces the ring buffer event header to be 8 bytes and not 4,
and will align the length of the data to be 8 byte aligned.
This keeps the data payload at 8 byte alignments and will allow these
machines to run without issue.

The trick to this is that the header can be either 4 bytes or 8 bytes
depending on the length of the data payload. The 4 byte header
has a length field that supports up to 112 bytes. If the length of
the data is more than 112, the length field is set to zero, and the actual
length is stored in the next 4 bytes after the header.

When CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set, the code forces
zero in the 4 byte header forcing the length to be stored in the 4 byte
array, even with a small data load. It also forces the length of the
data load to be 8 byte aligned. The combination of these two guarantee
that the data is always at 8 byte alignment.

Tested-by: Frederic Weisbecker <fweisbec@gmail.com>
           (on sparc64)
Reported-by: Frederic Weisbecker <fweisbec@gmail.com>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
2010-03-18 23:11:35 -04:00
..
blktrace.c blktrace: perform cleanup after setup error 2010-02-28 19:47:19 +01:00
ftrace.c Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2010-03-13 14:43:01 -08:00
Kconfig Merge branch 'tracing/core' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing into tracing/core 2010-02-27 10:06:10 +01:00
kmemtrace.c
Makefile perf events: Remove CONFIG_EVENT_PROFILE 2009-12-28 10:33:06 +01:00
power-traces.c tracing/power: Remove two exports 2009-12-13 18:37:28 +01:00
ring_buffer_benchmark.c local_t: Move local.h include to ringbuffer.c and ring_buffer_benchmark.c 2010-01-05 15:34:50 +09:00
ring_buffer.c ring-buffer: Do 8 byte alignment for 64 bit that can not handle 4 byte align 2010-03-18 23:11:35 -04:00
trace_boot.c
trace_branch.c tracing: Add correct/incorrect to sort keys for branch annotation output 2010-02-09 21:35:05 -05:00
trace_clock.c tracing: Include irqflags headers from trace clock 2010-02-28 19:45:01 +01:00
trace_entries.h
trace_event_profile.c rcu, ftrace: Fix RCU lockdep splat in ftrace_perf_buf_prepare() 2010-03-04 12:07:35 +01:00
trace_events_filter.c Merge branch 'perf/urgent' into perf/core 2010-01-29 10:36:22 +01:00
trace_events.c tracing: Simplify memory recycle of trace_define_field 2010-02-25 10:42:55 -05:00
trace_export.c tracing: Remove show_format and related macros from TRACE_EVENT 2010-01-06 12:08:46 -05:00
trace_functions_graph.c Merge branch 'tracing-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2010-03-13 14:40:50 -08:00
trace_functions.c
trace_hw_branches.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu 2009-12-14 09:58:24 -08:00
trace_irqsoff.c tracing: Add stack trace to irqsoff tracer 2009-12-11 13:19:51 -05:00
trace_kprobe.c Merge branch 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2010-02-28 10:20:25 -08:00
trace_ksym.c ksym_tracer: Remove trace_stat 2009-12-30 07:50:50 +01:00
trace_mmiotrace.c
trace_nop.c
trace_output.c tracing: Add full state to trace_seq 2009-12-09 14:05:49 -05:00
trace_output.h
trace_printk.c
trace_sched_switch.c
trace_sched_wakeup.c locking: Convert __raw_spin* functions to arch_spin* 2009-12-14 23:55:32 +01:00
trace_selftest_dynamic.c
trace_selftest.c locking: Convert __raw_spin* functions to arch_spin* 2009-12-14 23:55:32 +01:00
trace_stack.c tracing: Fix circular dead lock in stack trace 2010-02-02 10:20:18 -05:00
trace_stat.c
trace_stat.h
trace_syscalls.c Merge branch 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2010-02-28 10:20:25 -08:00
trace_sysprof.c perf events, x86/stacktrace: Make stack walking optional 2009-12-17 09:56:19 +01:00
trace_workqueue.c
trace.c Merge branch 'tracing-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2010-03-13 14:40:50 -08:00
trace.h Merge branch 'tracing-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2010-03-13 14:40:50 -08:00