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:
GeunSik Lim 2009-06-02 15:01:37 +09:00 committed by Greg Kroah-Hartman
parent 1b713e0050
commit 156f5a7801
20 changed files with 238 additions and 191 deletions

View file

@ -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

View file

@ -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:

View 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

View file

@ -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

View file

@ -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
----------- -----------

View file

@ -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

View file

@ -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
*******************************************************************/ *******************************************************************/

View file

@ -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;
} }
} }

View file

@ -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;
} }

View file

@ -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

View file

@ -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.

View file

@ -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 */

View file

@ -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:

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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) \

View file

@ -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

View file

@ -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

View file

@ -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