Steven Rostedt
d01343244a
ring-buffer: Fix typo of time extends per page
...
Time stamps for the ring buffer are created by the difference between
two events. Each page of the ring buffer holds a full 64 bit timestamp.
Each event has a 27 bit delta stamp from the last event. The unit of time
is nanoseconds, so 27 bits can hold ~134 milliseconds. If two events
happen more than 134 milliseconds apart, a time extend is inserted
to add more bits for the delta. The time extend has 59 bits, which
is good for ~18 years.
Currently the time extend is committed separately from the event.
If an event is discarded before it is committed, due to filtering,
the time extend still exists. If all events are being filtered, then
after ~134 milliseconds a new time extend will be added to the buffer.
This can only happen till the end of the page. Since each page holds
a full timestamp, there is no reason to add a time extend to the
beginning of a page. Time extends can only fill a page that has actual
data at the beginning, so there is no fear that time extends will fill
more than a page without any data.
When reading an event, a loop is made to skip over time extends
since they are only used to maintain the time stamp and are never
given to the caller. As a paranoid check to prevent the loop running
forever, with the knowledge that time extends may only fill a page,
a check is made that tests the iteration of the loop, and if the
iteration is more than the number of time extends that can fit in a page
a warning is printed and the ring buffer is disabled (all of ftrace
is also disabled with it).
There is another event type that is called a TIMESTAMP which can
hold 64 bits of data in the theoretical case that two events happen
18 years apart. This code has not been implemented, but the name
of this event exists, as well as the structure for it. The
size of a TIMESTAMP is 16 bytes, where as a time extend is only
8 bytes. The macro used to calculate how many time extends can fit on
a page used the TIMESTAMP size instead of the time extend size
cutting the amount in half.
The following test case can easily trigger the warning since we only
need to have half the page filled with time extends to trigger the
warning:
# cd /sys/kernel/debug/tracing/
# echo function > current_tracer
# echo 'common_pid < 0' > events/ftrace/function/filter
# echo > trace
# echo 1 > trace_marker
# sleep 120
# cat trace
Enabling the function tracer and then setting the filter to only trace
functions where the process id is negative (no events), then clearing
the trace buffer to ensure that we have nothing in the buffer,
then write to trace_marker to add an event to the beginning of a page,
sleep for 2 minutes (only 35 seconds is probably needed, but this
guarantees the bug), and then finally reading the trace which will
trigger the bug.
This patch fixes the typo and prevents the false positive of that warning.
Reported-by: Hans J. Koch <hjk@linutronix.de>
Tested-by: Hans J. Koch <hjk@linutronix.de>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Stable Kernel <stable@kernel.org>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
2010-10-12 12:06:43 -04:00
..
debug
Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2010-09-08 11:13:42 -07:00
gcov
gcov: fix null-pointer dereference for certain module types
2010-09-09 18:57:23 -07:00
irq
irq: Add new IRQ flag IRQF_NO_SUSPEND
2010-07-29 13:24:57 +02:00
power
Merge branch 'pm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6
2010-09-11 15:50:53 -07:00
time
time: Workaround gcc loop optimization that causes 64bit div errors
2010-08-13 12:03:24 -07:00
trace
ring-buffer: Fix typo of time extends per page
2010-10-12 12:06:43 -04:00
.gitignore
acct.c
pass a struct path to vfs_statfs
2010-08-09 16:48:42 -04:00
async.c
async: use workqueue for worker pool
2010-07-14 11:29:46 +02:00
audit.c
Merge branch 'for-linus' of git://git.infradead.org/users/eparis/notify
2010-08-10 11:39:13 -07:00
audit.h
Audit: split audit watch Kconfig
2010-07-28 09:58:19 -04:00
audit_tree.c
fanotify: use both marks when possible
2010-07-28 10:18:55 -04:00
audit_watch.c
Revert "fsnotify: store struct file not struct path"
2010-08-12 14:23:04 -07:00
auditfilter.c
audit: do not get and put just to free a watch
2010-07-28 09:58:17 -04:00
auditsc.c
vfs: add helpers to get root and pwd
2010-08-11 00:28:20 -04:00
backtracetest.c
bounds.c
kbuild: move bounds.h to include/generated
2009-12-12 13:08:14 +01:00
capability.c
sched: Remove remaining USER_SCHED code
2010-04-02 20:12:00 +02:00
cgroup.c
cgroups: fix API thinko
2010-09-09 18:57:23 -07:00
cgroup_freezer.c
Freezer / cgroup freezer: Update stale locking comments
2010-05-10 23:18:47 +02:00
compat.c
compat: Make compat_alloc_user_space() incorporate the access_ok()
2010-09-14 16:08:45 -07:00
configs.c
cpu.c
sched: adjust when cpu_active and cpuset configurations are updated during cpu on/offlining
2010-06-08 21:40:36 +02:00
cpuset.c
Merge branch 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2010-08-06 09:39:22 -07:00
cred.c
Add a dummy printk function for the maintenance of unused printks
2010-08-12 09:51:35 -07:00
delayacct.c
dma.c
early_res.c
kmemleak: Add support for NO_BOOTMEM configurations
2010-07-19 11:54:15 +01:00
elfcore.c
elf coredump: add extended numbering support
2010-03-06 11:26:46 -08:00
exec_domain.c
sys_personality: remove the bogus checks in sys_personality()->__set_personality() path
2010-08-09 20:45:05 -07:00
exit.c
Fix unprotected access to task credentials in waitid()
2010-08-17 18:07:43 -07:00
extable.c
fork.c
rmap: fix walk during fork
2010-09-22 17:22:39 -07:00
freezer.c
futex.c
futex: futex_find_get_task remove credentails check
2010-06-30 15:43:44 -07:00
futex_compat.c
futex: Protect pid lookup in compat code with RCU
2009-12-09 14:22:14 +01:00
groups.c
kernel/groups.c: fix integer overflow in groups_search
2010-09-09 18:57:24 -07:00
hrtimer.c
gcc-4.6: kernel/*: Fix unused but set warnings
2010-09-05 14:36:58 +02:00
hung_task.c
softlockup: Fix hung_task_check_count sysctl
2009-11-27 06:21:57 +01:00
hw_breakpoint.c
hw breakpoints: Fix pid namespace bug
2010-09-17 04:42:59 +02:00
itimer.c
kallsyms.c
kdb: core for kgdb back end (2 of 2)
2010-05-20 21:04:21 -05:00
Kconfig.freezer
Kconfig.hz
Kconfig.locks
mutex: Better control mutex adaptive spinning config
2009-12-03 11:50:11 +01:00
Kconfig.preempt
kexec.c
kexec: return -EFAULT on copy_to_user() failures
2010-08-11 08:59:22 -07:00
kfifo.c
kfifo: fix scatterlist usage
2010-10-01 10:50:58 -07:00
kmod.c
Make do_execve() take a const filename pointer
2010-08-17 18:07:43 -07:00
kprobes.c
kprobes: Move enable/disable_kprobe() out from debugfs code
2010-05-08 18:08:30 +02:00
ksysfs.c
sysfs: add struct file* to bin_attr callbacks
2010-05-21 09:37:31 -07:00
kthread.c
kthread: implement kthread_data()
2010-06-29 10:07:09 +02:00
latencytop.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
lockdep.c
sched_clock: Add local_clock() API and improve documentation
2010-06-09 10:34:49 +02:00
lockdep_internals.h
lockdep: No need to disable preemption in debug atomic ops
2010-05-04 05:38:16 +02:00
lockdep_proc.c
lockstat: Make lockstat counting per cpu
2010-04-06 00:15:37 +02:00
lockdep_states.h
Makefile
Merge branch 'for-linus' of git://git.infradead.org/users/eparis/notify
2010-08-10 11:39:13 -07:00
module.c
modules: Fix module_bug_list list corruption race
2010-10-05 11:29:27 -07:00
mutex-debug.c
mutex-debug.h
locking: Implement new raw_spinlock
2009-12-14 23:55:32 +01:00
mutex.c
mutex: Fix annotations to include it in kernel-locking docbook
2010-09-03 08:19:51 +02:00
mutex.h
notifier.c
sched: Use lockdep-based checking on rcu_dereference()
2010-02-25 10:34:26 +01:00
ns_cgroup.c
nsproxy.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
padata.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
2010-08-04 15:23:14 -07:00
panic.c
lib/bug.c: add oops end marker to WARN implementation
2010-08-11 08:59:22 -07:00
params.c
param: locking for kernel parameters
2010-08-11 23:04:20 +09:30
perf_event.c
perf: Fix incorrect copy_from_user() usage
2010-10-12 11:45:01 +02:00
pid.c
pids: alloc_pidmap: remove the unnecessary boundary checks
2010-08-11 08:59:20 -07:00
pid_namespace.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
pm_qos_params.c
PM QoS: Correct pr_debug() misuse and improve parameter checks
2010-09-11 00:53:05 +02:00
posix-cpu-timers.c
Merge branch 'writable_limits' of git://decibel.fi.muni.cz/~xslaby/linux
2010-08-10 12:07:51 -07:00
posix-timers.c
posix_timer: Move copy_to_user(created_timer_id) down in timer_create()
2010-07-23 15:08:12 +02:00
printk.c
gcc-4.6: printk: use stable variable to dump kmsg buffer
2010-08-09 20:45:06 -07:00
profile.c
numa: in-kernel profiling: use cpu_to_mem() for per cpu allocations
2010-05-27 09:12:57 -07:00
ptrace.c
ptrace: optimize exit_ptrace() for the likely case
2010-08-11 08:59:19 -07:00
range.c
kernel/range: remove unused definition of ARRAY_SIZE()
2010-08-09 20:45:06 -07:00
rcupdate.c
tree/tiny rcu: Add debug RCU head objects
2010-06-14 16:37:26 -07:00
rcutiny.c
tree/tiny rcu: Add debug RCU head objects
2010-06-14 16:37:26 -07:00
rcutiny_plugin.h
rcu: slim down rcutiny by removing rcu_scheduler_active and friends
2010-05-10 11:08:34 -07:00
rcutorture.c
sched_clock: Add local_clock() API and improve documentation
2010-06-09 10:34:49 +02:00
rcutree.c
tree/tiny rcu: Add debug RCU head objects
2010-06-14 16:37:26 -07:00
rcutree.h
rcu: reduce the number of spurious RCU_SOFTIRQ invocations
2010-05-10 11:08:35 -07:00
rcutree_plugin.h
rcu: remove all rcu head initializations, except on_stack initializations
2010-05-11 16:10:47 -07:00
rcutree_trace.c
rcu: reduce the number of spurious RCU_SOFTIRQ invocations
2010-05-10 11:08:35 -07:00
relay.c
kernel/: convert cpu notifier to return encapsulate errno value
2010-05-27 09:12:48 -07:00
res_counter.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
resource.c
resource: shared I/O region support
2010-05-11 12:01:10 -07:00
rtmutex-debug.c
sched: Convert pi_lock to raw_spinlock
2009-12-14 23:55:33 +01:00
rtmutex-debug.h
rtmutex-tester.c
rtmutex.c
rtmutes: Convert rtmutex.lock to raw_spinlock
2009-12-14 23:55:33 +01:00
rtmutex.h
rtmutex_common.h
rwsem.c
sched.c
sched: Fix user time incorrectly accounted as system time on 32-bit
2010-09-15 10:41:36 +02:00
sched_clock.c
sched_clock: Add local_clock() API and improve documentation
2010-06-09 10:34:49 +02:00
sched_cpupri.c
sched: No need for bootmem special cases
2010-07-17 12:06:22 +02:00
sched_cpupri.h
sched: No need for bootmem special cases
2010-07-17 12:06:22 +02:00
sched_debug.c
sched: Use correct macro to display sched_child_runs_first in /proc/sched_debug
2010-07-21 21:46:12 +02:00
sched_fair.c
sched: Fix nohz balance kick
2010-09-21 13:50:50 +02:00
sched_features.h
sched: Remove ASYM_GRAN feature
2010-03-11 18:32:53 +01:00
sched_idletask.c
sched: Cure load average vs NO_HZ woes
2010-04-23 11:02:02 +02:00
sched_rt.c
sched: task_tick_rt: Remove the obsolete ->signal != NULL check
2010-06-18 10:46:56 +02:00
sched_stats.h
sched: Remove the obsolete exit_state/signal hacks
2010-06-18 10:46:56 +02:00
seccomp.c
semaphore.c
signal.c
HWPOISON: Copy si_addr_lsb to user
2010-10-07 09:41:25 +02:00
smp.c
generic-ipi: Fix deadlock in __smp_call_function_single
2010-09-10 16:48:40 +02:00
softirq.c
kernel/: fix BUG_ON checks for cpu notifier callbacks direct call
2010-06-04 15:21:45 -07:00
spinlock.c
locking: Cleanup the name space completely
2009-12-14 23:55:33 +01:00
srcu.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
stacktrace.c
stop_machine.c
stop_machine: struct cpu_stopper, remove alignment padding on 64 bits
2010-08-09 20:45:06 -07:00
sys.c
pid: make setpgid() system call use RCU read-side critical section
2010-08-31 17:00:18 -07:00
sys_ni.c
fanotify: sys_fanotify_mark declartion
2010-07-28 09:58:55 -04:00
sysctl.c
sysctl: fix min/max handling in __do_proc_doulongvec_minmax()
2010-10-07 13:31:21 -07:00
sysctl_binary.c
sysctl: don't use own implementation of hex_to_bin()
2010-05-25 08:07:05 -07:00
sysctl_check.c
ipv4 05/05: add sysctl to accept packets with local source addresses
2009-12-03 12:14:38 -08:00
taskstats.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
2010-03-30 22:02:32 +09:00
test_kprobes.c
time.c
time: Kill off CONFIG_GENERIC_TIME
2010-07-27 12:40:54 +02:00
timeconst.pl
timer.c
kernel/timer.c: fix kernel-doc function parameter warning
2010-08-10 15:33:09 -07:00
tracepoint.c
tracing: Let tracepoints have data passed to tracepoint callbacks
2010-05-14 09:50:34 -04:00
tsacct.c
mm: clean up mm_counter
2010-03-06 11:26:23 -08:00
uid16.c
up.c
user-return-notifier.c
core: Clean up user return notifers use of per_cpu
2009-12-02 10:22:59 +01:00
user.c
sched: Remove a stale comment
2010-05-10 08:48:39 +02:00
user_namespace.c
user_ns: Introduce user_nsmap_uid and user_ns_map_gid.
2010-06-16 14:55:34 -07:00
utsname.c
utsname_sysctl.c
wait.c
watchdog.c
lockup_detector: Sync touch_*_watchdog back to old semantics
2010-09-01 10:02:28 +02:00
workqueue.c
workqueue: add documentation
2010-09-13 10:26:52 +02:00
workqueue_sched.h
workqueue: implement concurrency managed dynamic worker pool
2010-06-29 10:07:14 +02:00