Frederic Weisbecker
c85a17e226
tracing/urgent: fix unbalanced ftrace_start_up
...
Perfcounter reports the following stats for a wide system
profiling:
#
# (2364 samples)
#
# Overhead Symbol
# ........ ......
#
15.40% [k] mwait_idle_with_hints
8.29% [k] read_hpet
5.75% [k] ftrace_caller
3.60% [k] ftrace_call
[...]
This snapshot has been taken while neither the function tracer nor
the function graph tracer was running.
With dynamic ftrace, such results show a wrong ftrace behaviour
because all calls to ftrace_caller or ftrace_graph_caller (the patched
calls to mcount) are supposed to be patched into nop if none of those
tracers are running.
The problem occurs after the first run of the function tracer. Once we
launch it a second time, the callsites will never be nopped back,
unless you set custom filters.
For example it happens during the self tests at boot time.
The function tracer selftest runs, and then the dynamic tracing is
tested too. After that, the callsites are left un-nopped.
This is because the reset callback of the function tracer tries to
unregister two ftrace callbacks in once: the common function tracer
and the function tracer with stack backtrace, regardless of which
one is currently in use.
It then creates an unbalance on ftrace_start_up value which is expected
to be zero when the last ftrace callback is unregistered. When it
reaches zero, the FTRACE_DISABLE_CALLS is set on the next ftrace
command, triggering the patching into nop. But since it becomes
unbalanced, ie becomes lower than zero, if the kernel functions
are patched again (as in every further function tracer runs), they
won't ever be nopped back.
Note that ftrace_call and ftrace_graph_call are still patched back
to ftrace_stub in the off case, but not the callers of ftrace_call
and ftrace_graph_caller. It means that the tracing is well deactivated
but we waste a useless call into every kernel function.
This patch just unregisters the right ftrace_ops for the function
tracer on its reset callback and ignores the other one which is
not registered, fixing the unbalance. The problem also happens
is .30
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: stable@kernel.org
2009-06-20 06:28:46 +02:00
..
irq
irq: slab alloc for default irq_affinity
2009-06-12 13:50:23 +03:00
power
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial
2009-06-14 13:46:25 -07:00
time
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
2009-06-11 09:01:14 +03:00
trace
tracing/urgent: fix unbalanced ftrace_start_up
2009-06-20 06:28:46 +02:00
.gitignore
acct.c
async.c
async: Fix lack of boot-time console due to insufficient synchronization
2009-06-08 12:31:53 -07:00
audit.c
Audit: remove spaces from audit_log_d_path
2009-04-05 13:49:04 -04:00
audit.h
audit_tree.c
Switch collect_mounts() to struct path
2009-06-11 21:36:01 -04:00
auditfilter.c
inotify: use GFP_NOFS in kernel_event() to work around a lockdep false-positive
2009-05-06 16:36:09 -07:00
auditsc.c
Audit: remove spaces from audit_log_d_path
2009-04-05 13:49:04 -04:00
backtracetest.c
bounds.c
capability.c
cgroup.c
Push BKL down into ->remount_fs()
2009-06-11 21:36:11 -04:00
cgroup_debug.c
debug cgroup: remove unneeded cgroup_lock
2009-04-02 19:04:54 -07:00
cgroup_freezer.c
compat.c
signals: implement sys_rt_tgsigqueueinfo
2009-04-30 19:24:24 +02:00
configs.c
cpu.c
cpumask: use set_cpu_active in init/main.c
2009-03-30 22:05:12 +10:30
cpuset.c
x86: remove some alloc_bootmem_cpumask_var calling
2009-06-11 19:27:07 +03:00
cred-internals.h
cred.c
CRED: Rename cred_exec_mutex to reflect that it's a guard against ptrace
2009-05-11 08:15:36 +10:00
delayacct.c
dma-coherent.c
dma-coherent: Restore dma_alloc_from_coherent() large alloc fall back policy.
2009-01-21 18:51:53 +09:00
dma.c
exec_domain.c
Get rid of indirect include of fs_struct.h
2009-03-31 23:00:27 -04:00
exit.c
Merge branch 'perfcounters-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2009-06-11 14:01:07 -07:00
extable.c
Merge branch 'tracing-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2009-04-05 11:04:19 -07:00
fork.c
Merge branch 'linus' into perfcounters/core
2009-06-11 17:55:42 +02:00
freezer.c
futex.c
futex: fix restart in wait_requeue_pi
2009-05-20 10:34:32 +02:00
futex_compat.c
hrtimer.c
hrtimer: fix rq->lock inversion (again)
2009-03-31 14:52:52 +02:00
hung_task.c
softlockup: ensure the task has been switched out once
2009-02-11 11:04:16 +01:00
itimer.c
timers: split process wide cpu clocks/timers
2009-02-05 13:04:33 +01:00
kallsyms.c
kernel/kallsyms.c: replace deprecated __initcall with device_initcall and fix whitespace
2009-06-09 22:37:52 +02:00
Kconfig.freezer
Kconfig.hz
Kconfig.preempt
kexec.c
PM core: rename suspend and resume functions
2009-06-12 21:32:31 +02:00
kfifo.c
kgdb.c
sysrq, intel_fb: fix sysrq g collision
2009-05-15 07:56:24 -05:00
kmod.c
kmod: Release sub_info on cred allocation failure.
2009-05-26 12:11:19 -07:00
kprobes.c
kprobes: fix to use text_mutex around arm/disarm kprobe
2009-05-08 16:23:48 -07:00
ksysfs.c
kthread.c
tracing/events: move trace point headers into include/trace/events
2009-04-14 22:05:43 -04:00
latencytop.c
sched, latencytop: incorporate review feedback from Andrew Morton
2009-02-11 10:18:04 +01:00
lockdep.c
Merge branch 'linus' into tracing/core
2009-05-07 11:17:34 +02:00
lockdep_internals.h
lockdep: increase MAX_LOCKDEP_ENTRIES and MAX_LOCKDEP_CHAINS
2009-05-12 19:59:52 +02:00
lockdep_proc.c
lockstat: warn about disabled lock debugging
2009-02-14 23:28:28 +01:00
lockdep_states.h
lockdep: move state bit definitions around
2009-02-14 23:27:59 +01:00
Makefile
Merge branch 'linus' into perfcounters/core
2009-06-11 17:55:42 +02:00
marker.c
module.c
module: trim exception table on init free.
2009-06-12 21:47:04 +09:30
mutex-debug.c
mutex-debug.h
mutex.c
Merge branch 'linus' into perfcounters/core
2009-06-11 17:55:42 +02:00
mutex.h
notifier.c
ns_cgroup.c
cgroups: relax ns_can_attach checks to allow attaching to grandchild cgroups
2009-04-02 19:04:53 -07:00
nsproxy.c
panic.c
Fix caller information for warn_slowpath_null
2009-05-16 13:41:28 -07:00
params.c
module_param: allow 'bool' module_params to be bool, not just int.
2009-06-12 21:46:58 +09:30
perf_counter.c
perf_counter: Add forward/backward attribute ABI compatibility
2009-06-12 14:28:52 +02:00
pid.c
pids: refactor vnr/nr_ns helpers to make them safe
2009-04-02 19:05:02 -07:00
pid_namespace.c
signals: zap_pid_ns_process() should use force_sig()
2009-04-02 19:04:58 -07:00
pm_qos_params.c
posix-cpu-timers.c
kernel/posix-cpu-timers.c: fix sparse warning
2009-04-30 08:08:31 +02:00
posix-timers.c
printk.c
Merge branch 'printk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2009-04-05 10:23:25 -07:00
profile.c
x86: remove some alloc_bootmem_cpumask_var calling
2009-06-11 19:27:07 +03:00
ptrace.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6
2009-06-11 10:01:41 -07:00
rcuclassic.c
kmemtrace, rcu: fix linux/rcutree.h and linux/rcuclassic.h dependencies
2009-04-03 12:23:02 +02:00
rcupdate.c
RCU: Don't try and predeclare inline funcs as it upsets some versions of gcc
2009-04-15 13:55:14 -07:00
rcupreempt.c
rcu: rcu_sched_grace_period(): kill the bogus flush_signals()
2009-05-05 20:28:05 +02:00
rcupreempt_trace.c
rcutorture.c
cpumask: convert rcutorture.c
2009-03-30 22:05:16 +10:30
rcutree.c
rcu: Add __rcu_pending tracing to hierarchical RCU
2009-04-14 11:33:43 +02:00
rcutree.h
kmemtrace, rcu: fix rcu_tree_trace.c data structure dependencies
2009-04-03 12:23:03 +02:00
rcutree_trace.c
rcu: Add __rcu_pending tracing to hierarchical RCU
2009-04-14 11:33:43 +02:00
relay.c
Merge branch 'tracing-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2009-04-05 11:04:19 -07:00
res_counter.c
resource.c
Remove 'recurse into child resources' logic from 'reserve_region_with_split()'
2009-04-18 21:44:24 -07:00
rtmutex-debug.c
rtmutex-debug.h
rtmutex-tester.c
rtmutex.c
trivial: fix ETIMEOUT -> ETIMEDOUT typos
2009-06-12 18:01:50 +02:00
rtmutex.h
rtmutex_common.h
rt_mutex: add proxy lock routines
2009-04-06 11:14:02 +02:00
rwsem.c
sched.c
sched: export kick_process
2009-06-12 22:27:01 +09:30
sched_clock.c
sched: Fix fallback sched_clock()'s offset when using jiffies
2009-05-09 10:08:19 +02:00
sched_cpupri.c
sched: use slab in cpupri_init()
2009-06-11 19:27:12 +03:00
sched_cpupri.h
cpumask: remove cpumask_t from core
2009-03-30 22:05:17 +10:30
sched_debug.c
sched: remove unused fields from struct rq
2009-03-24 23:16:51 +01:00
sched_fair.c
sched: remove redundant hierarchy walk in check_preempt_wakeup
2009-04-09 08:19:08 +02:00
sched_features.h
Merge branch 'locking-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2009-03-30 17:17:35 -07:00
sched_idletask.c
sched, timers: move calc_load() to scheduler
2009-05-15 15:32:45 +02:00
sched_rt.c
cpumask: alloc zeroed cpumask for static cpumask_var_ts
2009-06-09 22:30:27 +09:30
sched_stats.h
sched: remove unused fields from struct rq
2009-03-24 23:16:51 +01:00
seccomp.c
x86-64: seccomp: fix 32/64 syscall hole
2009-03-02 15:41:30 -08:00
semaphore.c
signal.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6
2009-06-11 10:01:41 -07:00
slow-work.c
slow_work_thread() should do the exclusive wait
2009-06-11 11:26:38 -07:00
smp.c
cpumask: alloc zeroed cpumask for static cpumask_var_ts
2009-06-09 22:30:27 +09:30
softirq.c
Merge branch 'tracing-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2009-06-10 19:53:40 -07:00
softlockup.c
softlockup: decouple hung tasks check from softlockup detection
2009-01-16 14:06:04 +01:00
spinlock.c
Allow rwlocks to re-enable interrupts
2009-04-02 19:05:11 -07:00
srcu.c
stacktrace.c
stop_machine.c
cpumask: remove cpumask_t from core
2009-03-30 22:05:17 +10:30
sys.c
Merge branch 'linus' into perfcounters/core
2009-04-29 14:47:05 +02:00
sys_ni.c
Merge commit 'v2.6.29-rc2' into perfcounters/core
2009-01-21 16:37:27 +01:00
sysctl.c
Merge branch 'perfcounters-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
2009-06-11 14:01:07 -07:00
sysctl_check.c
net: add ARP notify option for devices
2009-02-01 01:04:33 -08:00
taskstats.c
test_kprobes.c
time.c
timeconst.pl
timer.c
Merge branch 'linus' into x86/mce3
2009-06-11 23:31:52 +02:00
tracepoint.c
tracepoints: dont update zero-sized tracepoint sections
2009-03-18 19:55:00 +01:00
tsacct.c
Fix fixpoint divide exception in acct_update_integrals
2009-03-09 08:13:35 -07:00
uid16.c
up.c
user.c
Merge branch 'master' into next
2009-03-24 10:52:46 +11:00
user_namespace.c
Fix recursive lock in free_uid()/free_user_ns()
2009-02-27 16:26:21 -08:00
utsname.c
utsname_sysctl.c
proc_sysctl: use CONFIG_PROC_SYSCTL around ipc and utsname proc_handlers
2009-04-02 19:05:01 -07:00
wait.c
wait: don't use __wake_up_common()
2009-04-14 17:17:16 +02:00
workqueue.c
ftrace, workqueuetrace: make workqueue tracepoints use TRACE_EVENT macro
2009-06-02 01:10:40 +02:00