diff options
author | Frank Ch. Eigler <fche@elastic.org> | 2008-08-11 17:34:47 -0400 |
---|---|---|
committer | Frank Ch. Eigler <fche@elastic.org> | 2008-08-11 17:34:47 -0400 |
commit | 42e740602dbb7960e11b0bbf9053e95e8a1cb1e5 (patch) | |
tree | aa32f56c7c5b1838e9d80bec2c15325c71742660 /testsuite/systemtap.examples/io/io_submit.stp | |
parent | 3213d0891c826f16ba727a3e863075e2922666a0 (diff) | |
parent | 79640c29c5bcf8de20f013dcc80e1a9c7a93811f (diff) | |
download | systemtap-steved-42e740602dbb7960e11b0bbf9053e95e8a1cb1e5.tar.gz systemtap-steved-42e740602dbb7960e11b0bbf9053e95e8a1cb1e5.tar.xz systemtap-steved-42e740602dbb7960e11b0bbf9053e95e8a1cb1e5.zip |
Merge commit 'origin/master' into pr4225
* commit 'origin/master': (34 commits)
PR5049: fix overbroad effects of naive "*" prefixing; instead use optional "*/" only.
stap-serverd was incorectly determining that the server could
stapprobes man page: clarify statement(NUM).absolute and process("path") searching
PR5049: prefix with "*" any filenames given in "fn@filename:line" probes
Indentation fix.
Redirect stderr gets redircted so warnings don't let example script run fail.
PR6835. io/io_submit.stp: Fix #! start. Convert to normal line-ending.
PR2895. Add proper #! /usr/bin/env stap line. Make example scripts executable.
Use INSTALL_PROGRAM, not INSTALL_DATA for executable .stp scripts.
example index: only warn if old, do not regenerate
Start/stop the systemtap server from systemtap.exp and not in the top level Makefile.
Lower statement wildcard test matching threshold.
Moved details of utrace detach to stap_utrace_detach().
Saves thread vma information.
Always generate examples indexes and install examples from srcdir.
Refer to srcdir spec file Makefile so make rpm works when builddir != srcdir.
Add index of subsystem and keywords at top of HTML indexes.
Don't output output, exits, status line in indexes (mentioned in descriptions).
Disable chmodding of samples/kmalloc-top in spec file since it isn't installed.
Make sure examples indexes are always generated in builddir.
...
Diffstat (limited to 'testsuite/systemtap.examples/io/io_submit.stp')
-rwxr-xr-x | testsuite/systemtap.examples/io/io_submit.stp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/testsuite/systemtap.examples/io/io_submit.stp b/testsuite/systemtap.examples/io/io_submit.stp new file mode 100755 index 00000000..13dcc5a3 --- /dev/null +++ b/testsuite/systemtap.examples/io/io_submit.stp @@ -0,0 +1,71 @@ +#! /usr/bin/env stap +# +# Copyright (C) 2007 Oracle Corp. Chris Mason <chris.mason@oracle.com> +# +# This was implemented to find the most common causes of schedule during +# the AIO io_submit call. It does this by recording which pids are inside +# AIO, and recording the current stack trace if one of those pids is +# inside schedule. +# When the probe exits, it prints out the 30 most common call stacks for +# schedule(). +# +# This file is free software. You can redistribute it and/or modify it under +# the terms of the GNU General Public License (GPL); either version 2, or (at +# your option) any later version. + +global in_iosubmit +global traces + +/* + * add a probe to sys_io_submit, on entry, record in the in_iosubmit + * hash table that this proc is in io_submit + */ +probe syscall.io_submit { + in_iosubmit[tid()] = 1 +} + +/* + * when we return from sys_io_submit, record that we're no longer there + */ +probe syscall.io_submit.return { + /* this assumes a given proc will do lots of io_submit calls, and + * so doesn't do the more expensive "delete in_iosubmit[p]". If + * there are lots of procs doing small number of io_submit calls, + * the hash may grow pretty big, so using delete may be better + */ + in_iosubmit[tid()] = 0 +} + +/* + * every time we call schedule, check to see if we started off in + * io_submit. If so, record our backtrace into the traces histogram + */ +probe kernel.function("schedule") { + if (tid() in in_iosubmit) { + traces[backtrace()]++ + + /* + * change this to if (1) if you want a backtrace every time + * you go into schedule from io_submit. Unfortunately, the traces + * saved into the traces histogram above are truncated to just a + * few lines. so the only way to see the full trace is via the + * more verbose print_backtrace() right here. + */ + if (0) { + printf("schedule in io_submit!\n") + print_backtrace() + } + } +} + +/* + * when stap is done (via ctrl-c) go through the record of all the + * trace paths and print the 30 most common. + */ +probe end { + foreach (stack in traces- limit 30) { + printf("%d:", traces[stack]) + print_stack(stack); + } +} + |