mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 03:06:10 +00:00
debugfs: Fix terminology inconsistency of dir name to mount debugfs filesystem.
Many developers use "/debug/" or "/debugfs/" or "/sys/kernel/debug/" directory name to mount debugfs filesystem for ftrace according to ./Documentation/tracers/ftrace.txt file. And, three directory names(ex:/debug/, /debugfs/, /sys/kernel/debug/) is existed in kernel source like ftrace, DRM, Wireless, Documentation, Network[sky2]files to mount debugfs filesystem. debugfs means debug filesystem for debugging easy to use by greg kroah hartman. "/sys/kernel/debug/" name is suitable as directory name of debugfs filesystem. - debugfs related reference: http://lwn.net/Articles/334546/ Fix inconsistency of directory name to mount debugfs filesystem. * From Steven Rostedt - find_debugfs() and tracing_files() in this patch. Signed-off-by: GeunSik Lim <geunsik.lim@samsung.com> Acked-by : Inaky Perez-Gonzalez <inaky@linux.intel.com> Reviewed-by : Steven Rostedt <rostedt@goodmis.org> Reviewed-by : James Smart <james.smart@emulex.com> CC: Jiri Kosina <trivial@kernel.org> CC: David Airlie <airlied@linux.ie> CC: Peter Osterlund <petero2@telia.com> CC: Ananth N Mavinakayanahalli <ananth@in.ibm.com> CC: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> CC: Masami Hiramatsu <mhiramat@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
1b713e0050
commit
156f5a7801
20 changed files with 238 additions and 191 deletions
|
@ -106,7 +106,7 @@
|
||||||
number of errors are printk'ed including a full stack trace.
|
number of errors are printk'ed including a full stack trace.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
The statistics are available via debugfs/debug_objects/stats.
|
The statistics are available via /sys/kernel/debug/debug_objects/stats.
|
||||||
They provide information about the number of warnings and the
|
They provide information about the number of warnings and the
|
||||||
number of successful fixups along with information about the
|
number of successful fixups along with information about the
|
||||||
usage of the internal tracking objects and the state of the
|
usage of the internal tracking objects and the state of the
|
||||||
|
|
|
@ -117,7 +117,7 @@ Using the pktcdvd debugfs interface
|
||||||
|
|
||||||
To read pktcdvd device infos in human readable form, do:
|
To read pktcdvd device infos in human readable form, do:
|
||||||
|
|
||||||
# cat /debug/pktcdvd/pktcdvd[0-7]/info
|
# cat /sys/kernel/debug/pktcdvd/pktcdvd[0-7]/info
|
||||||
|
|
||||||
For a description of the debugfs interface look into the file:
|
For a description of the debugfs interface look into the file:
|
||||||
|
|
||||||
|
|
|
@ -29,16 +29,16 @@ o debugfs entries
|
||||||
fault-inject-debugfs kernel module provides some debugfs entries for runtime
|
fault-inject-debugfs kernel module provides some debugfs entries for runtime
|
||||||
configuration of fault-injection capabilities.
|
configuration of fault-injection capabilities.
|
||||||
|
|
||||||
- /debug/fail*/probability:
|
- /sys/kernel/debug/fail*/probability:
|
||||||
|
|
||||||
likelihood of failure injection, in percent.
|
likelihood of failure injection, in percent.
|
||||||
Format: <percent>
|
Format: <percent>
|
||||||
|
|
||||||
Note that one-failure-per-hundred is a very high error rate
|
Note that one-failure-per-hundred is a very high error rate
|
||||||
for some testcases. Consider setting probability=100 and configure
|
for some testcases. Consider setting probability=100 and configure
|
||||||
/debug/fail*/interval for such testcases.
|
/sys/kernel/debug/fail*/interval for such testcases.
|
||||||
|
|
||||||
- /debug/fail*/interval:
|
- /sys/kernel/debug/fail*/interval:
|
||||||
|
|
||||||
specifies the interval between failures, for calls to
|
specifies the interval between failures, for calls to
|
||||||
should_fail() that pass all the other tests.
|
should_fail() that pass all the other tests.
|
||||||
|
@ -46,18 +46,18 @@ configuration of fault-injection capabilities.
|
||||||
Note that if you enable this, by setting interval>1, you will
|
Note that if you enable this, by setting interval>1, you will
|
||||||
probably want to set probability=100.
|
probably want to set probability=100.
|
||||||
|
|
||||||
- /debug/fail*/times:
|
- /sys/kernel/debug/fail*/times:
|
||||||
|
|
||||||
specifies how many times failures may happen at most.
|
specifies how many times failures may happen at most.
|
||||||
A value of -1 means "no limit".
|
A value of -1 means "no limit".
|
||||||
|
|
||||||
- /debug/fail*/space:
|
- /sys/kernel/debug/fail*/space:
|
||||||
|
|
||||||
specifies an initial resource "budget", decremented by "size"
|
specifies an initial resource "budget", decremented by "size"
|
||||||
on each call to should_fail(,size). Failure injection is
|
on each call to should_fail(,size). Failure injection is
|
||||||
suppressed until "space" reaches zero.
|
suppressed until "space" reaches zero.
|
||||||
|
|
||||||
- /debug/fail*/verbose
|
- /sys/kernel/debug/fail*/verbose
|
||||||
|
|
||||||
Format: { 0 | 1 | 2 }
|
Format: { 0 | 1 | 2 }
|
||||||
specifies the verbosity of the messages when failure is
|
specifies the verbosity of the messages when failure is
|
||||||
|
@ -65,17 +65,17 @@ configuration of fault-injection capabilities.
|
||||||
log line per failure; '2' will print a call trace too -- useful
|
log line per failure; '2' will print a call trace too -- useful
|
||||||
to debug the problems revealed by fault injection.
|
to debug the problems revealed by fault injection.
|
||||||
|
|
||||||
- /debug/fail*/task-filter:
|
- /sys/kernel/debug/fail*/task-filter:
|
||||||
|
|
||||||
Format: { 'Y' | 'N' }
|
Format: { 'Y' | 'N' }
|
||||||
A value of 'N' disables filtering by process (default).
|
A value of 'N' disables filtering by process (default).
|
||||||
Any positive value limits failures to only processes indicated by
|
Any positive value limits failures to only processes indicated by
|
||||||
/proc/<pid>/make-it-fail==1.
|
/proc/<pid>/make-it-fail==1.
|
||||||
|
|
||||||
- /debug/fail*/require-start:
|
- /sys/kernel/debug/fail*/require-start:
|
||||||
- /debug/fail*/require-end:
|
- /sys/kernel/debug/fail*/require-end:
|
||||||
- /debug/fail*/reject-start:
|
- /sys/kernel/debug/fail*/reject-start:
|
||||||
- /debug/fail*/reject-end:
|
- /sys/kernel/debug/fail*/reject-end:
|
||||||
|
|
||||||
specifies the range of virtual addresses tested during
|
specifies the range of virtual addresses tested during
|
||||||
stacktrace walking. Failure is injected only if some caller
|
stacktrace walking. Failure is injected only if some caller
|
||||||
|
@ -84,26 +84,26 @@ configuration of fault-injection capabilities.
|
||||||
Default required range is [0,ULONG_MAX) (whole of virtual address space).
|
Default required range is [0,ULONG_MAX) (whole of virtual address space).
|
||||||
Default rejected range is [0,0).
|
Default rejected range is [0,0).
|
||||||
|
|
||||||
- /debug/fail*/stacktrace-depth:
|
- /sys/kernel/debug/fail*/stacktrace-depth:
|
||||||
|
|
||||||
specifies the maximum stacktrace depth walked during search
|
specifies the maximum stacktrace depth walked during search
|
||||||
for a caller within [require-start,require-end) OR
|
for a caller within [require-start,require-end) OR
|
||||||
[reject-start,reject-end).
|
[reject-start,reject-end).
|
||||||
|
|
||||||
- /debug/fail_page_alloc/ignore-gfp-highmem:
|
- /sys/kernel/debug/fail_page_alloc/ignore-gfp-highmem:
|
||||||
|
|
||||||
Format: { 'Y' | 'N' }
|
Format: { 'Y' | 'N' }
|
||||||
default is 'N', setting it to 'Y' won't inject failures into
|
default is 'N', setting it to 'Y' won't inject failures into
|
||||||
highmem/user allocations.
|
highmem/user allocations.
|
||||||
|
|
||||||
- /debug/failslab/ignore-gfp-wait:
|
- /sys/kernel/debug/failslab/ignore-gfp-wait:
|
||||||
- /debug/fail_page_alloc/ignore-gfp-wait:
|
- /sys/kernel/debug/fail_page_alloc/ignore-gfp-wait:
|
||||||
|
|
||||||
Format: { 'Y' | 'N' }
|
Format: { 'Y' | 'N' }
|
||||||
default is 'N', setting it to 'Y' will inject failures
|
default is 'N', setting it to 'Y' will inject failures
|
||||||
only into non-sleep allocations (GFP_ATOMIC allocations).
|
only into non-sleep allocations (GFP_ATOMIC allocations).
|
||||||
|
|
||||||
- /debug/fail_page_alloc/min-order:
|
- /sys/kernel/debug/fail_page_alloc/min-order:
|
||||||
|
|
||||||
specifies the minimum page allocation order to be injected
|
specifies the minimum page allocation order to be injected
|
||||||
failures.
|
failures.
|
||||||
|
@ -166,13 +166,13 @@ o Inject slab allocation failures into module init/exit code
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
FAILTYPE=failslab
|
FAILTYPE=failslab
|
||||||
echo Y > /debug/$FAILTYPE/task-filter
|
echo Y > /sys/kernel/debug/$FAILTYPE/task-filter
|
||||||
echo 10 > /debug/$FAILTYPE/probability
|
echo 10 > /sys/kernel/debug/$FAILTYPE/probability
|
||||||
echo 100 > /debug/$FAILTYPE/interval
|
echo 100 > /sys/kernel/debug/$FAILTYPE/interval
|
||||||
echo -1 > /debug/$FAILTYPE/times
|
echo -1 > /sys/kernel/debug/$FAILTYPE/times
|
||||||
echo 0 > /debug/$FAILTYPE/space
|
echo 0 > /sys/kernel/debug/$FAILTYPE/space
|
||||||
echo 2 > /debug/$FAILTYPE/verbose
|
echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
|
||||||
echo 1 > /debug/$FAILTYPE/ignore-gfp-wait
|
echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
|
||||||
|
|
||||||
faulty_system()
|
faulty_system()
|
||||||
{
|
{
|
||||||
|
@ -217,20 +217,20 @@ then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cat /sys/module/$module/sections/.text > /debug/$FAILTYPE/require-start
|
cat /sys/module/$module/sections/.text > /sys/kernel/debug/$FAILTYPE/require-start
|
||||||
cat /sys/module/$module/sections/.data > /debug/$FAILTYPE/require-end
|
cat /sys/module/$module/sections/.data > /sys/kernel/debug/$FAILTYPE/require-end
|
||||||
|
|
||||||
echo N > /debug/$FAILTYPE/task-filter
|
echo N > /sys/kernel/debug/$FAILTYPE/task-filter
|
||||||
echo 10 > /debug/$FAILTYPE/probability
|
echo 10 > /sys/kernel/debug/$FAILTYPE/probability
|
||||||
echo 100 > /debug/$FAILTYPE/interval
|
echo 100 > /sys/kernel/debug/$FAILTYPE/interval
|
||||||
echo -1 > /debug/$FAILTYPE/times
|
echo -1 > /sys/kernel/debug/$FAILTYPE/times
|
||||||
echo 0 > /debug/$FAILTYPE/space
|
echo 0 > /sys/kernel/debug/$FAILTYPE/space
|
||||||
echo 2 > /debug/$FAILTYPE/verbose
|
echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
|
||||||
echo 1 > /debug/$FAILTYPE/ignore-gfp-wait
|
echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
|
||||||
echo 1 > /debug/$FAILTYPE/ignore-gfp-highmem
|
echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-highmem
|
||||||
echo 10 > /debug/$FAILTYPE/stacktrace-depth
|
echo 10 > /sys/kernel/debug/$FAILTYPE/stacktrace-depth
|
||||||
|
|
||||||
trap "echo 0 > /debug/$FAILTYPE/probability" SIGINT SIGTERM EXIT
|
trap "echo 0 > /sys/kernel/debug/$FAILTYPE/probability" SIGINT SIGTERM EXIT
|
||||||
|
|
||||||
echo "Injecting errors into the module $module... (interrupt to stop)"
|
echo "Injecting errors into the module $module... (interrupt to stop)"
|
||||||
sleep 1000000
|
sleep 1000000
|
||||||
|
|
|
@ -507,9 +507,9 @@ http://www.linuxsymposium.org/2006/linuxsymposium_procv2.pdf (pages 101-115)
|
||||||
Appendix A: The kprobes debugfs interface
|
Appendix A: The kprobes debugfs interface
|
||||||
|
|
||||||
With recent kernels (> 2.6.20) the list of registered kprobes is visible
|
With recent kernels (> 2.6.20) the list of registered kprobes is visible
|
||||||
under the /debug/kprobes/ directory (assuming debugfs is mounted at /debug).
|
under the /sys/kernel/debug/kprobes/ directory (assuming debugfs is mounted at //sys/kernel/debug).
|
||||||
|
|
||||||
/debug/kprobes/list: Lists all registered probes on the system
|
/sys/kernel/debug/kprobes/list: Lists all registered probes on the system
|
||||||
|
|
||||||
c015d71a k vfs_read+0x0
|
c015d71a k vfs_read+0x0
|
||||||
c011a316 j do_fork+0x0
|
c011a316 j do_fork+0x0
|
||||||
|
@ -525,7 +525,7 @@ virtual addresses that correspond to modules that've been unloaded),
|
||||||
such probes are marked with [GONE]. If the probe is temporarily disabled,
|
such probes are marked with [GONE]. If the probe is temporarily disabled,
|
||||||
such probes are marked with [DISABLED].
|
such probes are marked with [DISABLED].
|
||||||
|
|
||||||
/debug/kprobes/enabled: Turn kprobes ON/OFF forcibly.
|
/sys/kernel/debug/kprobes/enabled: Turn kprobes ON/OFF forcibly.
|
||||||
|
|
||||||
Provides a knob to globally and forcibly turn registered kprobes ON or OFF.
|
Provides a knob to globally and forcibly turn registered kprobes ON or OFF.
|
||||||
By default, all kprobes are enabled. By echoing "0" to this file, all
|
By default, all kprobes are enabled. By echoing "0" to this file, all
|
||||||
|
|
|
@ -7,7 +7,6 @@ Copyright 2008 Red Hat Inc.
|
||||||
(dual licensed under the GPL v2)
|
(dual licensed under the GPL v2)
|
||||||
Reviewers: Elias Oltmanns, Randy Dunlap, Andrew Morton,
|
Reviewers: Elias Oltmanns, Randy Dunlap, Andrew Morton,
|
||||||
John Kacur, and David Teigland.
|
John Kacur, and David Teigland.
|
||||||
|
|
||||||
Written for: 2.6.28-rc2
|
Written for: 2.6.28-rc2
|
||||||
|
|
||||||
Introduction
|
Introduction
|
||||||
|
@ -33,13 +32,26 @@ The File System
|
||||||
Ftrace uses the debugfs file system to hold the control files as
|
Ftrace uses the debugfs file system to hold the control files as
|
||||||
well as the files to display output.
|
well as the files to display output.
|
||||||
|
|
||||||
To mount the debugfs system:
|
When debugfs is configured into the kernel (which selecting any ftrace
|
||||||
|
option will do) the directory /sys/kernel/debug will be created. To mount
|
||||||
|
this directory, you can add to your /etc/fstab file:
|
||||||
|
|
||||||
# mkdir /debug
|
debugfs /sys/kernel/debug debugfs defaults 0 0
|
||||||
# mount -t debugfs nodev /debug
|
|
||||||
|
|
||||||
( Note: it is more common to mount at /sys/kernel/debug, but for
|
Or you can mount it at run time with:
|
||||||
simplicity this document will use /debug)
|
|
||||||
|
mount -t debugfs nodev /sys/kernel/debug
|
||||||
|
|
||||||
|
For quicker access to that directory you may want to make a soft link to
|
||||||
|
it:
|
||||||
|
|
||||||
|
ln -s /sys/kernel/debug /debug
|
||||||
|
|
||||||
|
Any selected ftrace option will also create a directory called tracing
|
||||||
|
within the debugfs. The rest of the document will assume that you are in
|
||||||
|
the ftrace directory (cd /sys/kernel/debug/tracing) and will only concentrate
|
||||||
|
on the files within that directory and not distract from the content with
|
||||||
|
the extended "/sys/kernel/debug/tracing" path name.
|
||||||
|
|
||||||
That's it! (assuming that you have ftrace configured into your kernel)
|
That's it! (assuming that you have ftrace configured into your kernel)
|
||||||
|
|
||||||
|
@ -389,18 +401,18 @@ trace_options
|
||||||
The trace_options file is used to control what gets printed in
|
The trace_options file is used to control what gets printed in
|
||||||
the trace output. To see what is available, simply cat the file:
|
the trace output. To see what is available, simply cat the file:
|
||||||
|
|
||||||
cat /debug/tracing/trace_options
|
cat trace_options
|
||||||
print-parent nosym-offset nosym-addr noverbose noraw nohex nobin \
|
print-parent nosym-offset nosym-addr noverbose noraw nohex nobin \
|
||||||
noblock nostacktrace nosched-tree nouserstacktrace nosym-userobj
|
noblock nostacktrace nosched-tree nouserstacktrace nosym-userobj
|
||||||
|
|
||||||
To disable one of the options, echo in the option prepended with
|
To disable one of the options, echo in the option prepended with
|
||||||
"no".
|
"no".
|
||||||
|
|
||||||
echo noprint-parent > /debug/tracing/trace_options
|
echo noprint-parent > trace_options
|
||||||
|
|
||||||
To enable an option, leave off the "no".
|
To enable an option, leave off the "no".
|
||||||
|
|
||||||
echo sym-offset > /debug/tracing/trace_options
|
echo sym-offset > trace_options
|
||||||
|
|
||||||
Here are the available options:
|
Here are the available options:
|
||||||
|
|
||||||
|
@ -476,11 +488,11 @@ sched_switch
|
||||||
This tracer simply records schedule switches. Here is an example
|
This tracer simply records schedule switches. Here is an example
|
||||||
of how to use it.
|
of how to use it.
|
||||||
|
|
||||||
# echo sched_switch > /debug/tracing/current_tracer
|
# echo sched_switch > current_tracer
|
||||||
# echo 1 > /debug/tracing/tracing_enabled
|
# echo 1 > tracing_enabled
|
||||||
# sleep 1
|
# sleep 1
|
||||||
# echo 0 > /debug/tracing/tracing_enabled
|
# echo 0 > tracing_enabled
|
||||||
# cat /debug/tracing/trace
|
# cat trace
|
||||||
|
|
||||||
# tracer: sched_switch
|
# tracer: sched_switch
|
||||||
#
|
#
|
||||||
|
@ -583,13 +595,13 @@ new trace is saved.
|
||||||
To reset the maximum, echo 0 into tracing_max_latency. Here is
|
To reset the maximum, echo 0 into tracing_max_latency. Here is
|
||||||
an example:
|
an example:
|
||||||
|
|
||||||
# echo irqsoff > /debug/tracing/current_tracer
|
# echo irqsoff > current_tracer
|
||||||
# echo 0 > /debug/tracing/tracing_max_latency
|
# echo 0 > tracing_max_latency
|
||||||
# echo 1 > /debug/tracing/tracing_enabled
|
# echo 1 > tracing_enabled
|
||||||
# ls -ltr
|
# ls -ltr
|
||||||
[...]
|
[...]
|
||||||
# echo 0 > /debug/tracing/tracing_enabled
|
# echo 0 > tracing_enabled
|
||||||
# cat /debug/tracing/latency_trace
|
# cat latency_trace
|
||||||
# tracer: irqsoff
|
# tracer: irqsoff
|
||||||
#
|
#
|
||||||
irqsoff latency trace v1.1.5 on 2.6.26
|
irqsoff latency trace v1.1.5 on 2.6.26
|
||||||
|
@ -690,13 +702,13 @@ Like the irqsoff tracer, it records the maximum latency for
|
||||||
which preemption was disabled. The control of preemptoff tracer
|
which preemption was disabled. The control of preemptoff tracer
|
||||||
is much like the irqsoff tracer.
|
is much like the irqsoff tracer.
|
||||||
|
|
||||||
# echo preemptoff > /debug/tracing/current_tracer
|
# echo preemptoff > current_tracer
|
||||||
# echo 0 > /debug/tracing/tracing_max_latency
|
# echo 0 > tracing_max_latency
|
||||||
# echo 1 > /debug/tracing/tracing_enabled
|
# echo 1 > tracing_enabled
|
||||||
# ls -ltr
|
# ls -ltr
|
||||||
[...]
|
[...]
|
||||||
# echo 0 > /debug/tracing/tracing_enabled
|
# echo 0 > tracing_enabled
|
||||||
# cat /debug/tracing/latency_trace
|
# cat latency_trace
|
||||||
# tracer: preemptoff
|
# tracer: preemptoff
|
||||||
#
|
#
|
||||||
preemptoff latency trace v1.1.5 on 2.6.26-rc8
|
preemptoff latency trace v1.1.5 on 2.6.26-rc8
|
||||||
|
@ -837,13 +849,13 @@ tracer.
|
||||||
Again, using this trace is much like the irqsoff and preemptoff
|
Again, using this trace is much like the irqsoff and preemptoff
|
||||||
tracers.
|
tracers.
|
||||||
|
|
||||||
# echo preemptirqsoff > /debug/tracing/current_tracer
|
# echo preemptirqsoff > current_tracer
|
||||||
# echo 0 > /debug/tracing/tracing_max_latency
|
# echo 0 > tracing_max_latency
|
||||||
# echo 1 > /debug/tracing/tracing_enabled
|
# echo 1 > tracing_enabled
|
||||||
# ls -ltr
|
# ls -ltr
|
||||||
[...]
|
[...]
|
||||||
# echo 0 > /debug/tracing/tracing_enabled
|
# echo 0 > tracing_enabled
|
||||||
# cat /debug/tracing/latency_trace
|
# cat latency_trace
|
||||||
# tracer: preemptirqsoff
|
# tracer: preemptirqsoff
|
||||||
#
|
#
|
||||||
preemptirqsoff latency trace v1.1.5 on 2.6.26-rc8
|
preemptirqsoff latency trace v1.1.5 on 2.6.26-rc8
|
||||||
|
@ -999,12 +1011,12 @@ slightly differently than we did with the previous tracers.
|
||||||
Instead of performing an 'ls', we will run 'sleep 1' under
|
Instead of performing an 'ls', we will run 'sleep 1' under
|
||||||
'chrt' which changes the priority of the task.
|
'chrt' which changes the priority of the task.
|
||||||
|
|
||||||
# echo wakeup > /debug/tracing/current_tracer
|
# echo wakeup > current_tracer
|
||||||
# echo 0 > /debug/tracing/tracing_max_latency
|
# echo 0 > tracing_max_latency
|
||||||
# echo 1 > /debug/tracing/tracing_enabled
|
# echo 1 > tracing_enabled
|
||||||
# chrt -f 5 sleep 1
|
# chrt -f 5 sleep 1
|
||||||
# echo 0 > /debug/tracing/tracing_enabled
|
# echo 0 > tracing_enabled
|
||||||
# cat /debug/tracing/latency_trace
|
# cat latency_trace
|
||||||
# tracer: wakeup
|
# tracer: wakeup
|
||||||
#
|
#
|
||||||
wakeup latency trace v1.1.5 on 2.6.26-rc8
|
wakeup latency trace v1.1.5 on 2.6.26-rc8
|
||||||
|
@ -1114,11 +1126,11 @@ can be done from the debug file system. Make sure the
|
||||||
ftrace_enabled is set; otherwise this tracer is a nop.
|
ftrace_enabled is set; otherwise this tracer is a nop.
|
||||||
|
|
||||||
# sysctl kernel.ftrace_enabled=1
|
# sysctl kernel.ftrace_enabled=1
|
||||||
# echo function > /debug/tracing/current_tracer
|
# echo function > current_tracer
|
||||||
# echo 1 > /debug/tracing/tracing_enabled
|
# echo 1 > tracing_enabled
|
||||||
# usleep 1
|
# usleep 1
|
||||||
# echo 0 > /debug/tracing/tracing_enabled
|
# echo 0 > tracing_enabled
|
||||||
# cat /debug/tracing/trace
|
# cat trace
|
||||||
# tracer: function
|
# tracer: function
|
||||||
#
|
#
|
||||||
# TASK-PID CPU# TIMESTAMP FUNCTION
|
# TASK-PID CPU# TIMESTAMP FUNCTION
|
||||||
|
@ -1155,7 +1167,7 @@ int trace_fd;
|
||||||
[...]
|
[...]
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
[...]
|
[...]
|
||||||
trace_fd = open("/debug/tracing/tracing_enabled", O_WRONLY);
|
trace_fd = open(tracing_file("tracing_enabled"), O_WRONLY);
|
||||||
[...]
|
[...]
|
||||||
if (condition_hit()) {
|
if (condition_hit()) {
|
||||||
write(trace_fd, "0", 1);
|
write(trace_fd, "0", 1);
|
||||||
|
@ -1163,26 +1175,20 @@ int main(int argc, char *argv[]) {
|
||||||
[...]
|
[...]
|
||||||
}
|
}
|
||||||
|
|
||||||
Note: Here we hard coded the path name. The debugfs mount is not
|
|
||||||
guaranteed to be at /debug (and is more commonly at
|
|
||||||
/sys/kernel/debug). For simple one time traces, the above is
|
|
||||||
sufficent. For anything else, a search through /proc/mounts may
|
|
||||||
be needed to find where the debugfs file-system is mounted.
|
|
||||||
|
|
||||||
|
|
||||||
Single thread tracing
|
Single thread tracing
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
By writing into /debug/tracing/set_ftrace_pid you can trace a
|
By writing into set_ftrace_pid you can trace a
|
||||||
single thread. For example:
|
single thread. For example:
|
||||||
|
|
||||||
# cat /debug/tracing/set_ftrace_pid
|
# cat set_ftrace_pid
|
||||||
no pid
|
no pid
|
||||||
# echo 3111 > /debug/tracing/set_ftrace_pid
|
# echo 3111 > set_ftrace_pid
|
||||||
# cat /debug/tracing/set_ftrace_pid
|
# cat set_ftrace_pid
|
||||||
3111
|
3111
|
||||||
# echo function > /debug/tracing/current_tracer
|
# echo function > current_tracer
|
||||||
# cat /debug/tracing/trace | head
|
# cat trace | head
|
||||||
# tracer: function
|
# tracer: function
|
||||||
#
|
#
|
||||||
# TASK-PID CPU# TIMESTAMP FUNCTION
|
# TASK-PID CPU# TIMESTAMP FUNCTION
|
||||||
|
@ -1193,8 +1199,8 @@ no pid
|
||||||
yum-updatesd-3111 [003] 1637.254683: lock_hrtimer_base <-hrtimer_try_to_cancel
|
yum-updatesd-3111 [003] 1637.254683: lock_hrtimer_base <-hrtimer_try_to_cancel
|
||||||
yum-updatesd-3111 [003] 1637.254685: fget_light <-do_sys_poll
|
yum-updatesd-3111 [003] 1637.254685: fget_light <-do_sys_poll
|
||||||
yum-updatesd-3111 [003] 1637.254686: pipe_poll <-do_sys_poll
|
yum-updatesd-3111 [003] 1637.254686: pipe_poll <-do_sys_poll
|
||||||
# echo -1 > /debug/tracing/set_ftrace_pid
|
# echo -1 > set_ftrace_pid
|
||||||
# cat /debug/tracing/trace |head
|
# cat trace |head
|
||||||
# tracer: function
|
# tracer: function
|
||||||
#
|
#
|
||||||
# TASK-PID CPU# TIMESTAMP FUNCTION
|
# TASK-PID CPU# TIMESTAMP FUNCTION
|
||||||
|
@ -1216,6 +1222,51 @@ something like this simple program:
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define _STR(x) #x
|
||||||
|
#define STR(x) _STR(x)
|
||||||
|
#define MAX_PATH 256
|
||||||
|
|
||||||
|
const char *find_debugfs(void)
|
||||||
|
{
|
||||||
|
static char debugfs[MAX_PATH+1];
|
||||||
|
static int debugfs_found;
|
||||||
|
char type[100];
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
if (debugfs_found)
|
||||||
|
return debugfs;
|
||||||
|
|
||||||
|
if ((fp = fopen("/proc/mounts","r")) == NULL) {
|
||||||
|
perror("/proc/mounts");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (fscanf(fp, "%*s %"
|
||||||
|
STR(MAX_PATH)
|
||||||
|
"s %99s %*s %*d %*d\n",
|
||||||
|
debugfs, type) == 2) {
|
||||||
|
if (strcmp(type, "debugfs") == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
if (strcmp(type, "debugfs") != 0) {
|
||||||
|
fprintf(stderr, "debugfs not mounted");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
debugfs_found = 1;
|
||||||
|
|
||||||
|
return debugfs;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *tracing_file(const char *file_name)
|
||||||
|
{
|
||||||
|
static char trace_file[MAX_PATH+1];
|
||||||
|
snprintf(trace_file, MAX_PATH, "%s/%s", find_debugfs(), file_name);
|
||||||
|
return trace_file;
|
||||||
|
}
|
||||||
|
|
||||||
int main (int argc, char **argv)
|
int main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
|
@ -1226,12 +1277,12 @@ int main (int argc, char **argv)
|
||||||
char line[64];
|
char line[64];
|
||||||
int s;
|
int s;
|
||||||
|
|
||||||
ffd = open("/debug/tracing/current_tracer", O_WRONLY);
|
ffd = open(tracing_file("current_tracer"), O_WRONLY);
|
||||||
if (ffd < 0)
|
if (ffd < 0)
|
||||||
exit(-1);
|
exit(-1);
|
||||||
write(ffd, "nop", 3);
|
write(ffd, "nop", 3);
|
||||||
|
|
||||||
fd = open("/debug/tracing/set_ftrace_pid", O_WRONLY);
|
fd = open(tracing_file("set_ftrace_pid"), O_WRONLY);
|
||||||
s = sprintf(line, "%d\n", getpid());
|
s = sprintf(line, "%d\n", getpid());
|
||||||
write(fd, line, s);
|
write(fd, line, s);
|
||||||
|
|
||||||
|
@ -1383,22 +1434,22 @@ want, depending on your needs.
|
||||||
tracing_cpu_mask file) or you might sometimes see unordered
|
tracing_cpu_mask file) or you might sometimes see unordered
|
||||||
function calls while cpu tracing switch.
|
function calls while cpu tracing switch.
|
||||||
|
|
||||||
hide: echo nofuncgraph-cpu > /debug/tracing/trace_options
|
hide: echo nofuncgraph-cpu > trace_options
|
||||||
show: echo funcgraph-cpu > /debug/tracing/trace_options
|
show: echo funcgraph-cpu > trace_options
|
||||||
|
|
||||||
- The duration (function's time of execution) is displayed on
|
- The duration (function's time of execution) is displayed on
|
||||||
the closing bracket line of a function or on the same line
|
the closing bracket line of a function or on the same line
|
||||||
than the current function in case of a leaf one. It is default
|
than the current function in case of a leaf one. It is default
|
||||||
enabled.
|
enabled.
|
||||||
|
|
||||||
hide: echo nofuncgraph-duration > /debug/tracing/trace_options
|
hide: echo nofuncgraph-duration > trace_options
|
||||||
show: echo funcgraph-duration > /debug/tracing/trace_options
|
show: echo funcgraph-duration > trace_options
|
||||||
|
|
||||||
- The overhead field precedes the duration field in case of
|
- The overhead field precedes the duration field in case of
|
||||||
reached duration thresholds.
|
reached duration thresholds.
|
||||||
|
|
||||||
hide: echo nofuncgraph-overhead > /debug/tracing/trace_options
|
hide: echo nofuncgraph-overhead > trace_options
|
||||||
show: echo funcgraph-overhead > /debug/tracing/trace_options
|
show: echo funcgraph-overhead > trace_options
|
||||||
depends on: funcgraph-duration
|
depends on: funcgraph-duration
|
||||||
|
|
||||||
ie:
|
ie:
|
||||||
|
@ -1427,8 +1478,8 @@ want, depending on your needs.
|
||||||
- The task/pid field displays the thread cmdline and pid which
|
- The task/pid field displays the thread cmdline and pid which
|
||||||
executed the function. It is default disabled.
|
executed the function. It is default disabled.
|
||||||
|
|
||||||
hide: echo nofuncgraph-proc > /debug/tracing/trace_options
|
hide: echo nofuncgraph-proc > trace_options
|
||||||
show: echo funcgraph-proc > /debug/tracing/trace_options
|
show: echo funcgraph-proc > trace_options
|
||||||
|
|
||||||
ie:
|
ie:
|
||||||
|
|
||||||
|
@ -1451,8 +1502,8 @@ want, depending on your needs.
|
||||||
system clock since it started. A snapshot of this time is
|
system clock since it started. A snapshot of this time is
|
||||||
given on each entry/exit of functions
|
given on each entry/exit of functions
|
||||||
|
|
||||||
hide: echo nofuncgraph-abstime > /debug/tracing/trace_options
|
hide: echo nofuncgraph-abstime > trace_options
|
||||||
show: echo funcgraph-abstime > /debug/tracing/trace_options
|
show: echo funcgraph-abstime > trace_options
|
||||||
|
|
||||||
ie:
|
ie:
|
||||||
|
|
||||||
|
@ -1549,7 +1600,7 @@ listed in:
|
||||||
|
|
||||||
available_filter_functions
|
available_filter_functions
|
||||||
|
|
||||||
# cat /debug/tracing/available_filter_functions
|
# cat available_filter_functions
|
||||||
put_prev_task_idle
|
put_prev_task_idle
|
||||||
kmem_cache_create
|
kmem_cache_create
|
||||||
pick_next_task_rt
|
pick_next_task_rt
|
||||||
|
@ -1561,12 +1612,12 @@ mutex_lock
|
||||||
If I am only interested in sys_nanosleep and hrtimer_interrupt:
|
If I am only interested in sys_nanosleep and hrtimer_interrupt:
|
||||||
|
|
||||||
# echo sys_nanosleep hrtimer_interrupt \
|
# echo sys_nanosleep hrtimer_interrupt \
|
||||||
> /debug/tracing/set_ftrace_filter
|
> set_ftrace_filter
|
||||||
# echo ftrace > /debug/tracing/current_tracer
|
# echo ftrace > current_tracer
|
||||||
# echo 1 > /debug/tracing/tracing_enabled
|
# echo 1 > tracing_enabled
|
||||||
# usleep 1
|
# usleep 1
|
||||||
# echo 0 > /debug/tracing/tracing_enabled
|
# echo 0 > tracing_enabled
|
||||||
# cat /debug/tracing/trace
|
# cat trace
|
||||||
# tracer: ftrace
|
# tracer: ftrace
|
||||||
#
|
#
|
||||||
# TASK-PID CPU# TIMESTAMP FUNCTION
|
# TASK-PID CPU# TIMESTAMP FUNCTION
|
||||||
|
@ -1577,7 +1628,7 @@ If I am only interested in sys_nanosleep and hrtimer_interrupt:
|
||||||
|
|
||||||
To see which functions are being traced, you can cat the file:
|
To see which functions are being traced, you can cat the file:
|
||||||
|
|
||||||
# cat /debug/tracing/set_ftrace_filter
|
# cat set_ftrace_filter
|
||||||
hrtimer_interrupt
|
hrtimer_interrupt
|
||||||
sys_nanosleep
|
sys_nanosleep
|
||||||
|
|
||||||
|
@ -1597,7 +1648,7 @@ Note: It is better to use quotes to enclose the wild cards,
|
||||||
otherwise the shell may expand the parameters into names
|
otherwise the shell may expand the parameters into names
|
||||||
of files in the local directory.
|
of files in the local directory.
|
||||||
|
|
||||||
# echo 'hrtimer_*' > /debug/tracing/set_ftrace_filter
|
# echo 'hrtimer_*' > set_ftrace_filter
|
||||||
|
|
||||||
Produces:
|
Produces:
|
||||||
|
|
||||||
|
@ -1618,7 +1669,7 @@ Produces:
|
||||||
|
|
||||||
Notice that we lost the sys_nanosleep.
|
Notice that we lost the sys_nanosleep.
|
||||||
|
|
||||||
# cat /debug/tracing/set_ftrace_filter
|
# cat set_ftrace_filter
|
||||||
hrtimer_run_queues
|
hrtimer_run_queues
|
||||||
hrtimer_run_pending
|
hrtimer_run_pending
|
||||||
hrtimer_init
|
hrtimer_init
|
||||||
|
@ -1644,17 +1695,17 @@ To append to the filters, use '>>'
|
||||||
To clear out a filter so that all functions will be recorded
|
To clear out a filter so that all functions will be recorded
|
||||||
again:
|
again:
|
||||||
|
|
||||||
# echo > /debug/tracing/set_ftrace_filter
|
# echo > set_ftrace_filter
|
||||||
# cat /debug/tracing/set_ftrace_filter
|
# cat set_ftrace_filter
|
||||||
#
|
#
|
||||||
|
|
||||||
Again, now we want to append.
|
Again, now we want to append.
|
||||||
|
|
||||||
# echo sys_nanosleep > /debug/tracing/set_ftrace_filter
|
# echo sys_nanosleep > set_ftrace_filter
|
||||||
# cat /debug/tracing/set_ftrace_filter
|
# cat set_ftrace_filter
|
||||||
sys_nanosleep
|
sys_nanosleep
|
||||||
# echo 'hrtimer_*' >> /debug/tracing/set_ftrace_filter
|
# echo 'hrtimer_*' >> set_ftrace_filter
|
||||||
# cat /debug/tracing/set_ftrace_filter
|
# cat set_ftrace_filter
|
||||||
hrtimer_run_queues
|
hrtimer_run_queues
|
||||||
hrtimer_run_pending
|
hrtimer_run_pending
|
||||||
hrtimer_init
|
hrtimer_init
|
||||||
|
@ -1677,7 +1728,7 @@ hrtimer_init_sleeper
|
||||||
The set_ftrace_notrace prevents those functions from being
|
The set_ftrace_notrace prevents those functions from being
|
||||||
traced.
|
traced.
|
||||||
|
|
||||||
# echo '*preempt*' '*lock*' > /debug/tracing/set_ftrace_notrace
|
# echo '*preempt*' '*lock*' > set_ftrace_notrace
|
||||||
|
|
||||||
Produces:
|
Produces:
|
||||||
|
|
||||||
|
@ -1767,13 +1818,13 @@ the effect on the tracing is different. Every read from
|
||||||
trace_pipe is consumed. This means that subsequent reads will be
|
trace_pipe is consumed. This means that subsequent reads will be
|
||||||
different. The trace is live.
|
different. The trace is live.
|
||||||
|
|
||||||
# echo function > /debug/tracing/current_tracer
|
# echo function > current_tracer
|
||||||
# cat /debug/tracing/trace_pipe > /tmp/trace.out &
|
# cat trace_pipe > /tmp/trace.out &
|
||||||
[1] 4153
|
[1] 4153
|
||||||
# echo 1 > /debug/tracing/tracing_enabled
|
# echo 1 > tracing_enabled
|
||||||
# usleep 1
|
# usleep 1
|
||||||
# echo 0 > /debug/tracing/tracing_enabled
|
# echo 0 > tracing_enabled
|
||||||
# cat /debug/tracing/trace
|
# cat trace
|
||||||
# tracer: function
|
# tracer: function
|
||||||
#
|
#
|
||||||
# TASK-PID CPU# TIMESTAMP FUNCTION
|
# TASK-PID CPU# TIMESTAMP FUNCTION
|
||||||
|
@ -1809,7 +1860,7 @@ number listed is the number of entries that can be recorded per
|
||||||
CPU. To know the full size, multiply the number of possible CPUS
|
CPU. To know the full size, multiply the number of possible CPUS
|
||||||
with the number of entries.
|
with the number of entries.
|
||||||
|
|
||||||
# cat /debug/tracing/buffer_size_kb
|
# cat buffer_size_kb
|
||||||
1408 (units kilobytes)
|
1408 (units kilobytes)
|
||||||
|
|
||||||
Note, to modify this, you must have tracing completely disabled.
|
Note, to modify this, you must have tracing completely disabled.
|
||||||
|
@ -1817,18 +1868,18 @@ To do that, echo "nop" into the current_tracer. If the
|
||||||
current_tracer is not set to "nop", an EINVAL error will be
|
current_tracer is not set to "nop", an EINVAL error will be
|
||||||
returned.
|
returned.
|
||||||
|
|
||||||
# echo nop > /debug/tracing/current_tracer
|
# echo nop > current_tracer
|
||||||
# echo 10000 > /debug/tracing/buffer_size_kb
|
# echo 10000 > buffer_size_kb
|
||||||
# cat /debug/tracing/buffer_size_kb
|
# cat buffer_size_kb
|
||||||
10000 (units kilobytes)
|
10000 (units kilobytes)
|
||||||
|
|
||||||
The number of pages which will be allocated is limited to a
|
The number of pages which will be allocated is limited to a
|
||||||
percentage of available memory. Allocating too much will produce
|
percentage of available memory. Allocating too much will produce
|
||||||
an error.
|
an error.
|
||||||
|
|
||||||
# echo 1000000000000 > /debug/tracing/buffer_size_kb
|
# echo 1000000000000 > buffer_size_kb
|
||||||
-bash: echo: write error: Cannot allocate memory
|
-bash: echo: write error: Cannot allocate memory
|
||||||
# cat /debug/tracing/buffer_size_kb
|
# cat buffer_size_kb
|
||||||
85
|
85
|
||||||
|
|
||||||
-----------
|
-----------
|
||||||
|
|
|
@ -32,41 +32,41 @@ is no way to automatically detect if you are losing events due to CPUs racing.
|
||||||
Usage Quick Reference
|
Usage Quick Reference
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
$ mount -t debugfs debugfs /debug
|
$ mount -t debugfs debugfs /sys/kernel/debug
|
||||||
$ echo mmiotrace > /debug/tracing/current_tracer
|
$ echo mmiotrace > /sys/kernel/debug/tracing/current_tracer
|
||||||
$ cat /debug/tracing/trace_pipe > mydump.txt &
|
$ cat /sys/kernel/debug/tracing/trace_pipe > mydump.txt &
|
||||||
Start X or whatever.
|
Start X or whatever.
|
||||||
$ echo "X is up" > /debug/tracing/trace_marker
|
$ echo "X is up" > /sys/kernel/debug/tracing/trace_marker
|
||||||
$ echo nop > /debug/tracing/current_tracer
|
$ echo nop > /sys/kernel/debug/tracing/current_tracer
|
||||||
Check for lost events.
|
Check for lost events.
|
||||||
|
|
||||||
|
|
||||||
Usage
|
Usage
|
||||||
-----
|
-----
|
||||||
|
|
||||||
Make sure debugfs is mounted to /debug. If not, (requires root privileges)
|
Make sure debugfs is mounted to /sys/kernel/debug. If not, (requires root privileges)
|
||||||
$ mount -t debugfs debugfs /debug
|
$ mount -t debugfs debugfs /sys/kernel/debug
|
||||||
|
|
||||||
Check that the driver you are about to trace is not loaded.
|
Check that the driver you are about to trace is not loaded.
|
||||||
|
|
||||||
Activate mmiotrace (requires root privileges):
|
Activate mmiotrace (requires root privileges):
|
||||||
$ echo mmiotrace > /debug/tracing/current_tracer
|
$ echo mmiotrace > /sys/kernel/debug/tracing/current_tracer
|
||||||
|
|
||||||
Start storing the trace:
|
Start storing the trace:
|
||||||
$ cat /debug/tracing/trace_pipe > mydump.txt &
|
$ cat /sys/kernel/debug/tracing/trace_pipe > mydump.txt &
|
||||||
The 'cat' process should stay running (sleeping) in the background.
|
The 'cat' process should stay running (sleeping) in the background.
|
||||||
|
|
||||||
Load the driver you want to trace and use it. Mmiotrace will only catch MMIO
|
Load the driver you want to trace and use it. Mmiotrace will only catch MMIO
|
||||||
accesses to areas that are ioremapped while mmiotrace is active.
|
accesses to areas that are ioremapped while mmiotrace is active.
|
||||||
|
|
||||||
During tracing you can place comments (markers) into the trace by
|
During tracing you can place comments (markers) into the trace by
|
||||||
$ echo "X is up" > /debug/tracing/trace_marker
|
$ echo "X is up" > /sys/kernel/debug/tracing/trace_marker
|
||||||
This makes it easier to see which part of the (huge) trace corresponds to
|
This makes it easier to see which part of the (huge) trace corresponds to
|
||||||
which action. It is recommended to place descriptive markers about what you
|
which action. It is recommended to place descriptive markers about what you
|
||||||
do.
|
do.
|
||||||
|
|
||||||
Shut down mmiotrace (requires root privileges):
|
Shut down mmiotrace (requires root privileges):
|
||||||
$ echo nop > /debug/tracing/current_tracer
|
$ echo nop > /sys/kernel/debug/tracing/current_tracer
|
||||||
The 'cat' process exits. If it does not, kill it by issuing 'fg' command and
|
The 'cat' process exits. If it does not, kill it by issuing 'fg' command and
|
||||||
pressing ctrl+c.
|
pressing ctrl+c.
|
||||||
|
|
||||||
|
@ -78,10 +78,10 @@ to view your kernel log and look for "mmiotrace has lost events" warning. If
|
||||||
events were lost, the trace is incomplete. You should enlarge the buffers and
|
events were lost, the trace is incomplete. You should enlarge the buffers and
|
||||||
try again. Buffers are enlarged by first seeing how large the current buffers
|
try again. Buffers are enlarged by first seeing how large the current buffers
|
||||||
are:
|
are:
|
||||||
$ cat /debug/tracing/buffer_size_kb
|
$ cat /sys/kernel/debug/tracing/buffer_size_kb
|
||||||
gives you a number. Approximately double this number and write it back, for
|
gives you a number. Approximately double this number and write it back, for
|
||||||
instance:
|
instance:
|
||||||
$ echo 128000 > /debug/tracing/buffer_size_kb
|
$ echo 128000 > /sys/kernel/debug/tracing/buffer_size_kb
|
||||||
Then start again from the top.
|
Then start again from the top.
|
||||||
|
|
||||||
If you are doing a trace for a driver project, e.g. Nouveau, you should also
|
If you are doing a trace for a driver project, e.g. Nouveau, you should also
|
||||||
|
|
|
@ -430,7 +430,7 @@ static void pkt_sysfs_cleanup(void)
|
||||||
/********************************************************************
|
/********************************************************************
|
||||||
entries in debugfs
|
entries in debugfs
|
||||||
|
|
||||||
/debugfs/pktcdvd[0-7]/
|
/sys/kernel/debug/pktcdvd[0-7]/
|
||||||
info
|
info
|
||||||
|
|
||||||
*******************************************************************/
|
*******************************************************************/
|
||||||
|
|
|
@ -105,7 +105,7 @@ int drm_debugfs_create_files(struct drm_info_list *files, int count,
|
||||||
ent = debugfs_create_file(files[i].name, S_IFREG | S_IRUGO,
|
ent = debugfs_create_file(files[i].name, S_IFREG | S_IRUGO,
|
||||||
root, tmp, &drm_debugfs_fops);
|
root, tmp, &drm_debugfs_fops);
|
||||||
if (!ent) {
|
if (!ent) {
|
||||||
DRM_ERROR("Cannot create /debugfs/dri/%s/%s\n",
|
DRM_ERROR("Cannot create /sys/kernel/debug/dri/%s/%s\n",
|
||||||
name, files[i].name);
|
name, files[i].name);
|
||||||
drm_free(tmp, sizeof(struct drm_info_node),
|
drm_free(tmp, sizeof(struct drm_info_node),
|
||||||
_DRM_DRIVER);
|
_DRM_DRIVER);
|
||||||
|
@ -133,9 +133,9 @@ EXPORT_SYMBOL(drm_debugfs_create_files);
|
||||||
* \param minor device minor number
|
* \param minor device minor number
|
||||||
* \param root DRI debugfs dir entry.
|
* \param root DRI debugfs dir entry.
|
||||||
*
|
*
|
||||||
* Create the DRI debugfs root entry "/debugfs/dri", the device debugfs root entry
|
* Create the DRI debugfs root entry "/sys/kernel/debug/dri", the device debugfs root entry
|
||||||
* "/debugfs/dri/%minor%/", and each entry in debugfs_list as
|
* "/sys/kernel/debug/dri/%minor%/", and each entry in debugfs_list as
|
||||||
* "/debugfs/dri/%minor%/%name%".
|
* "/sys/kernel/debug/dri/%minor%/%name%".
|
||||||
*/
|
*/
|
||||||
int drm_debugfs_init(struct drm_minor *minor, int minor_id,
|
int drm_debugfs_init(struct drm_minor *minor, int minor_id,
|
||||||
struct dentry *root)
|
struct dentry *root)
|
||||||
|
@ -148,7 +148,7 @@ int drm_debugfs_init(struct drm_minor *minor, int minor_id,
|
||||||
sprintf(name, "%d", minor_id);
|
sprintf(name, "%d", minor_id);
|
||||||
minor->debugfs_root = debugfs_create_dir(name, root);
|
minor->debugfs_root = debugfs_create_dir(name, root);
|
||||||
if (!minor->debugfs_root) {
|
if (!minor->debugfs_root) {
|
||||||
DRM_ERROR("Cannot create /debugfs/dri/%s\n", name);
|
DRM_ERROR("Cannot create /sys/kernel/debug/dri/%s\n", name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@ int drm_debugfs_init(struct drm_minor *minor, int minor_id,
|
||||||
ret = dev->driver->debugfs_init(minor);
|
ret = dev->driver->debugfs_init(minor);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
DRM_ERROR("DRM: Driver failed to initialize "
|
DRM_ERROR("DRM: Driver failed to initialize "
|
||||||
"/debugfs/dri.\n");
|
"/sys/kernel/debug/dri.\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -339,7 +339,7 @@ static int __init drm_core_init(void)
|
||||||
|
|
||||||
drm_debugfs_root = debugfs_create_dir("dri", NULL);
|
drm_debugfs_root = debugfs_create_dir("dri", NULL);
|
||||||
if (!drm_debugfs_root) {
|
if (!drm_debugfs_root) {
|
||||||
DRM_ERROR("Cannot create /debugfs/dri\n");
|
DRM_ERROR("Cannot create /sys/kernel/debug/dri\n");
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto err_p3;
|
goto err_p3;
|
||||||
}
|
}
|
||||||
|
|
|
@ -343,7 +343,7 @@ static int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int t
|
||||||
#if defined(CONFIG_DEBUG_FS)
|
#if defined(CONFIG_DEBUG_FS)
|
||||||
ret = drm_debugfs_init(new_minor, minor_id, drm_debugfs_root);
|
ret = drm_debugfs_init(new_minor, minor_id, drm_debugfs_root);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
DRM_ERROR("DRM: Failed to initialize /debugfs/dri.\n");
|
DRM_ERROR("DRM: Failed to initialize /sys/kernel/debug/dri.\n");
|
||||||
goto err_g2;
|
goto err_g2;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2206,7 +2206,7 @@ config SKGE_DEBUG
|
||||||
depends on SKGE && DEBUG_FS
|
depends on SKGE && DEBUG_FS
|
||||||
help
|
help
|
||||||
This option adds the ability to dump driver state for debugging.
|
This option adds the ability to dump driver state for debugging.
|
||||||
The file debugfs/skge/ethX displays the state of the internal
|
The file /sys/kernel/debug/skge/ethX displays the state of the internal
|
||||||
transmit and receive rings.
|
transmit and receive rings.
|
||||||
|
|
||||||
If unsure, say N.
|
If unsure, say N.
|
||||||
|
@ -2232,7 +2232,7 @@ config SKY2_DEBUG
|
||||||
depends on SKY2 && DEBUG_FS
|
depends on SKY2 && DEBUG_FS
|
||||||
help
|
help
|
||||||
This option adds the ability to dump driver state for debugging.
|
This option adds the ability to dump driver state for debugging.
|
||||||
The file debugfs/sky2/ethX displays the state of the internal
|
The file /sys/kernel/debug/sky2/ethX displays the state of the internal
|
||||||
transmit and receive rings.
|
transmit and receive rings.
|
||||||
|
|
||||||
If unsure, say N.
|
If unsure, say N.
|
||||||
|
|
|
@ -432,7 +432,7 @@ struct i2400m {
|
||||||
unsigned ready:1; /* all probing steps done */
|
unsigned ready:1; /* all probing steps done */
|
||||||
unsigned rx_reorder:1; /* RX reorder is enabled */
|
unsigned rx_reorder:1; /* RX reorder is enabled */
|
||||||
u8 trace_msg_from_user; /* echo rx msgs to 'trace' pipe */
|
u8 trace_msg_from_user; /* echo rx msgs to 'trace' pipe */
|
||||||
/* typed u8 so debugfs/u8 can tweak */
|
/* typed u8 so /sys/kernel/debug/u8 can tweak */
|
||||||
enum i2400m_system_state state;
|
enum i2400m_system_state state;
|
||||||
wait_queue_head_t state_wq; /* Woken up when on state updates */
|
wait_queue_head_t state_wq; /* Woken up when on state updates */
|
||||||
|
|
||||||
|
|
|
@ -28,11 +28,10 @@ config ATH5K_DEBUG
|
||||||
Say Y, if and you will get debug options for ath5k.
|
Say Y, if and you will get debug options for ath5k.
|
||||||
To use this, you need to mount debugfs:
|
To use this, you need to mount debugfs:
|
||||||
|
|
||||||
mkdir /debug/
|
mount -t debugfs debug /sys/kernel/debug
|
||||||
mount -t debugfs debug /debug/
|
|
||||||
|
|
||||||
You will get access to files under:
|
You will get access to files under:
|
||||||
/debug/ath5k/phy0/
|
/sys/kernel/debug/ath5k/phy0/
|
||||||
|
|
||||||
To enable debug, pass the debug level to the debug module
|
To enable debug, pass the debug level to the debug module
|
||||||
parameter. For example:
|
parameter. For example:
|
||||||
|
|
|
@ -72,7 +72,7 @@ rdrf
|
||||||
location that is to be read. This parameter must be specified in
|
location that is to be read. This parameter must be specified in
|
||||||
hexadecimal (its possible to preceed preceding the number with a "0x").
|
hexadecimal (its possible to preceed preceding the number with a "0x").
|
||||||
|
|
||||||
Path: /debugfs/libertas_wireless/ethX/registers/
|
Path: /sys/kernel/debug/libertas_wireless/ethX/registers/
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
echo "0xa123" > rdmac ; cat rdmac
|
echo "0xa123" > rdmac ; cat rdmac
|
||||||
|
@ -95,7 +95,7 @@ wrrf
|
||||||
sleepparams
|
sleepparams
|
||||||
This command is used to set the sleepclock configurations
|
This command is used to set the sleepclock configurations
|
||||||
|
|
||||||
Path: /debugfs/libertas_wireless/ethX/
|
Path: /sys/kernel/debug/libertas_wireless/ethX/
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
cat sleepparams: reads the current sleepclock configuration
|
cat sleepparams: reads the current sleepclock configuration
|
||||||
|
@ -115,7 +115,7 @@ subscribed_events
|
||||||
The subscribed_events directory contains the interface for the
|
The subscribed_events directory contains the interface for the
|
||||||
subscribed events API.
|
subscribed events API.
|
||||||
|
|
||||||
Path: /debugfs/libertas_wireless/ethX/subscribed_events/
|
Path: /sys/kernel/debug/libertas_wireless/ethX/subscribed_events/
|
||||||
|
|
||||||
Each event is represented by a filename. Each filename consists of the
|
Each event is represented by a filename. Each filename consists of the
|
||||||
following three fields:
|
following three fields:
|
||||||
|
@ -165,7 +165,7 @@ subscribed_events
|
||||||
extscan
|
extscan
|
||||||
This command is used to do a specific scan.
|
This command is used to do a specific scan.
|
||||||
|
|
||||||
Path: /debugfs/libertas_wireless/ethX/
|
Path: /sys/kernel/debug/libertas_wireless/ethX/
|
||||||
|
|
||||||
Usage: echo "SSID" > extscan
|
Usage: echo "SSID" > extscan
|
||||||
|
|
||||||
|
@ -179,7 +179,7 @@ getscantable
|
||||||
Display the current contents of the driver scan table (ie. get the
|
Display the current contents of the driver scan table (ie. get the
|
||||||
scan results).
|
scan results).
|
||||||
|
|
||||||
Path: /debugfs/libertas_wireless/ethX/
|
Path: /sys/kernel/debug/libertas_wireless/ethX/
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
cat getscantable
|
cat getscantable
|
||||||
|
@ -188,7 +188,7 @@ setuserscan
|
||||||
Initiate a customized scan and retrieve the results
|
Initiate a customized scan and retrieve the results
|
||||||
|
|
||||||
|
|
||||||
Path: /debugfs/libertas_wireless/ethX/
|
Path: /sys/kernel/debug/libertas_wireless/ethX/
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
echo "[ARGS]" > setuserscan
|
echo "[ARGS]" > setuserscan
|
||||||
|
|
|
@ -53,8 +53,7 @@
|
||||||
* debugfs interface
|
* debugfs interface
|
||||||
*
|
*
|
||||||
* To access this interface the user should:
|
* To access this interface the user should:
|
||||||
* # mkdir /debug
|
* # mount -t debugfs none /sys/kernel/debug
|
||||||
* # mount -t debugfs none /debug
|
|
||||||
*
|
*
|
||||||
* The lpfc debugfs directory hierarchy is:
|
* The lpfc debugfs directory hierarchy is:
|
||||||
* lpfc/lpfcX/vportY
|
* lpfc/lpfcX/vportY
|
||||||
|
|
|
@ -406,7 +406,7 @@ static inline char *pack_hex_byte(char *buf, u8 byte)
|
||||||
*
|
*
|
||||||
* Use tracing_on/tracing_off when you want to quickly turn on or off
|
* Use tracing_on/tracing_off when you want to quickly turn on or off
|
||||||
* tracing. It simply enables or disables the recording of the trace events.
|
* tracing. It simply enables or disables the recording of the trace events.
|
||||||
* This also corresponds to the user space debugfs/tracing/tracing_on
|
* This also corresponds to the user space /sys/kernel/debug/tracing/tracing_on
|
||||||
* file, which gives a means for the kernel and userspace to interact.
|
* file, which gives a means for the kernel and userspace to interact.
|
||||||
* Place a tracing_off() in the kernel where you want tracing to end.
|
* Place a tracing_off() in the kernel where you want tracing to end.
|
||||||
* From user space, examine the trace, and then echo 1 > tracing_on
|
* From user space, examine the trace, and then echo 1 > tracing_on
|
||||||
|
|
|
@ -198,7 +198,7 @@ static inline void tracepoint_synchronize_unregister(void)
|
||||||
* * This is how the trace record is structured and will
|
* * This is how the trace record is structured and will
|
||||||
* * be saved into the ring buffer. These are the fields
|
* * be saved into the ring buffer. These are the fields
|
||||||
* * that will be exposed to user-space in
|
* * that will be exposed to user-space in
|
||||||
* * /debug/tracing/events/<*>/format.
|
* * /sys/kernel/debug/tracing/events/<*>/format.
|
||||||
* *
|
* *
|
||||||
* * The declared 'local variable' is called '__entry'
|
* * The declared 'local variable' is called '__entry'
|
||||||
* *
|
* *
|
||||||
|
@ -258,7 +258,7 @@ static inline void tracepoint_synchronize_unregister(void)
|
||||||
* tracepoint callback (this is used by programmatic plugins and
|
* tracepoint callback (this is used by programmatic plugins and
|
||||||
* can also by used by generic instrumentation like SystemTap), and
|
* can also by used by generic instrumentation like SystemTap), and
|
||||||
* it is also used to expose a structured trace record in
|
* it is also used to expose a structured trace record in
|
||||||
* /debug/tracing/events/.
|
* /sys/kernel/debug/tracing/events/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define TRACE_EVENT(name, proto, args, struct, assign, print) \
|
#define TRACE_EVENT(name, proto, args, struct, assign, print) \
|
||||||
|
|
|
@ -147,7 +147,7 @@ config IRQSOFF_TRACER
|
||||||
disabled by default and can be runtime (re-)started
|
disabled by default and can be runtime (re-)started
|
||||||
via:
|
via:
|
||||||
|
|
||||||
echo 0 > /debugfs/tracing/tracing_max_latency
|
echo 0 > /sys/kernel/debug/tracing/tracing_max_latency
|
||||||
|
|
||||||
(Note that kernel size and overhead increases with this option
|
(Note that kernel size and overhead increases with this option
|
||||||
enabled. This option and the preempt-off timing option can be
|
enabled. This option and the preempt-off timing option can be
|
||||||
|
@ -168,7 +168,7 @@ config PREEMPT_TRACER
|
||||||
disabled by default and can be runtime (re-)started
|
disabled by default and can be runtime (re-)started
|
||||||
via:
|
via:
|
||||||
|
|
||||||
echo 0 > /debugfs/tracing/tracing_max_latency
|
echo 0 > /sys/kernel/debug/tracing/tracing_max_latency
|
||||||
|
|
||||||
(Note that kernel size and overhead increases with this option
|
(Note that kernel size and overhead increases with this option
|
||||||
enabled. This option and the irqs-off timing option can be
|
enabled. This option and the irqs-off timing option can be
|
||||||
|
@ -261,7 +261,7 @@ config PROFILE_ANNOTATED_BRANCHES
|
||||||
This tracer profiles all the the likely and unlikely macros
|
This tracer profiles all the the likely and unlikely macros
|
||||||
in the kernel. It will display the results in:
|
in the kernel. It will display the results in:
|
||||||
|
|
||||||
/debugfs/tracing/profile_annotated_branch
|
/sys/kernel/debug/tracing/profile_annotated_branch
|
||||||
|
|
||||||
Note: this will add a significant overhead, only turn this
|
Note: this will add a significant overhead, only turn this
|
||||||
on if you need to profile the system's use of these macros.
|
on if you need to profile the system's use of these macros.
|
||||||
|
@ -274,7 +274,7 @@ config PROFILE_ALL_BRANCHES
|
||||||
taken in the kernel is recorded whether it hit or miss.
|
taken in the kernel is recorded whether it hit or miss.
|
||||||
The results will be displayed in:
|
The results will be displayed in:
|
||||||
|
|
||||||
/debugfs/tracing/profile_branch
|
/sys/kernel/debug/tracing/profile_branch
|
||||||
|
|
||||||
This option also enables the likely/unlikely profiler.
|
This option also enables the likely/unlikely profiler.
|
||||||
|
|
||||||
|
@ -323,7 +323,7 @@ config STACK_TRACER
|
||||||
select KALLSYMS
|
select KALLSYMS
|
||||||
help
|
help
|
||||||
This special tracer records the maximum stack footprint of the
|
This special tracer records the maximum stack footprint of the
|
||||||
kernel and displays it in debugfs/tracing/stack_trace.
|
kernel and displays it in /sys/kernel/debug/tracing/stack_trace.
|
||||||
|
|
||||||
This tracer works by hooking into every function call that the
|
This tracer works by hooking into every function call that the
|
||||||
kernel executes, and keeping a maximum stack depth value and
|
kernel executes, and keeping a maximum stack depth value and
|
||||||
|
|
|
@ -344,7 +344,7 @@ static raw_spinlock_t ftrace_max_lock =
|
||||||
/*
|
/*
|
||||||
* Copy the new maximum trace into the separate maximum-trace
|
* Copy the new maximum trace into the separate maximum-trace
|
||||||
* structure. (this way the maximum trace is permanently saved,
|
* structure. (this way the maximum trace is permanently saved,
|
||||||
* for later retrieval via /debugfs/tracing/latency_trace)
|
* for later retrieval via /sys/kernel/debug/tracing/latency_trace)
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
__update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)
|
__update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)
|
||||||
|
@ -2414,21 +2414,20 @@ static const struct file_operations tracing_iter_fops = {
|
||||||
|
|
||||||
static const char readme_msg[] =
|
static const char readme_msg[] =
|
||||||
"tracing mini-HOWTO:\n\n"
|
"tracing mini-HOWTO:\n\n"
|
||||||
"# mkdir /debug\n"
|
"# mount -t debugfs nodev /sys/kernel/debug\n\n"
|
||||||
"# mount -t debugfs nodev /debug\n\n"
|
"# cat /sys/kernel/debug/tracing/available_tracers\n"
|
||||||
"# cat /debug/tracing/available_tracers\n"
|
|
||||||
"wakeup preemptirqsoff preemptoff irqsoff function sched_switch nop\n\n"
|
"wakeup preemptirqsoff preemptoff irqsoff function sched_switch nop\n\n"
|
||||||
"# cat /debug/tracing/current_tracer\n"
|
"# cat /sys/kernel/debug/tracing/current_tracer\n"
|
||||||
"nop\n"
|
"nop\n"
|
||||||
"# echo sched_switch > /debug/tracing/current_tracer\n"
|
"# echo sched_switch > /sys/kernel/debug/tracing/current_tracer\n"
|
||||||
"# cat /debug/tracing/current_tracer\n"
|
"# cat /sys/kernel/debug/tracing/current_tracer\n"
|
||||||
"sched_switch\n"
|
"sched_switch\n"
|
||||||
"# cat /debug/tracing/trace_options\n"
|
"# cat /sys/kernel/debug/tracing/trace_options\n"
|
||||||
"noprint-parent nosym-offset nosym-addr noverbose\n"
|
"noprint-parent nosym-offset nosym-addr noverbose\n"
|
||||||
"# echo print-parent > /debug/tracing/trace_options\n"
|
"# echo print-parent > /sys/kernel/debug/tracing/trace_options\n"
|
||||||
"# echo 1 > /debug/tracing/tracing_enabled\n"
|
"# echo 1 > /sys/kernel/debug/tracing/tracing_enabled\n"
|
||||||
"# cat /debug/tracing/trace > /tmp/trace.txt\n"
|
"# cat /sys/kernel/debug/tracing/trace > /tmp/trace.txt\n"
|
||||||
"# echo 0 > /debug/tracing/tracing_enabled\n"
|
"# echo 0 > /sys/kernel/debug/tracing/tracing_enabled\n"
|
||||||
;
|
;
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
|
|
|
@ -12,10 +12,9 @@ calls. Only the functions's names and the the call time are provided.
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
Be sure that you have CONFIG_FUNCTION_TRACER
|
Be sure that you have CONFIG_FUNCTION_TRACER
|
||||||
# mkdir /debugfs
|
# mount -t debugfs nodev /sys/kernel/debug
|
||||||
# mount -t debug debug /debug
|
# echo function > /sys/kernel/debug/tracing/current_tracer
|
||||||
# echo function > /debug/tracing/current_tracer
|
$ cat /sys/kernel/debug/tracing/trace_pipe > ~/raw_trace_func
|
||||||
$ cat /debug/tracing/trace_pipe > ~/raw_trace_func
|
|
||||||
Wait some times but not too much, the script is a bit slow.
|
Wait some times but not too much, the script is a bit slow.
|
||||||
Break the pipe (Ctrl + Z)
|
Break the pipe (Ctrl + Z)
|
||||||
$ scripts/draw_functrace.py < raw_trace_func > draw_functrace
|
$ scripts/draw_functrace.py < raw_trace_func > draw_functrace
|
||||||
|
|
Loading…
Reference in a new issue