summaryrefslogtreecommitdiffstats
path: root/testsuite/systemtap.examples/futexes.stp
diff options
context:
space:
mode:
authorFrank Ch. Eigler <fche@elastic.org>2008-04-24 13:55:34 -0400
committerFrank Ch. Eigler <fche@elastic.org>2008-04-24 13:55:34 -0400
commitfe44e686c32ccb684bd5ec6df57aed00532fc024 (patch)
tree260953c84c8679572d65bf83a65884050f91d2f7 /testsuite/systemtap.examples/futexes.stp
parentf72154b33e67069cd7c308d24255574b9fbacb1d (diff)
parent478e10649195945adf7153fe5254932df1e2a902 (diff)
downloadsystemtap-steved-fe44e686c32ccb684bd5ec6df57aed00532fc024.tar.gz
systemtap-steved-fe44e686c32ccb684bd5ec6df57aed00532fc024.tar.xz
systemtap-steved-fe44e686c32ccb684bd5ec6df57aed00532fc024.zip
Merge branch 'master' of ssh://sources.redhat.com/git/systemtap
* 'master' of ssh://sources.redhat.com/git/systemtap: Made kernel 2.6.25 changes in task_finder.c. Move examples to testsuite/systemtap.examples
Diffstat (limited to 'testsuite/systemtap.examples/futexes.stp')
-rwxr-xr-xtestsuite/systemtap.examples/futexes.stp36
1 files changed, 36 insertions, 0 deletions
diff --git a/testsuite/systemtap.examples/futexes.stp b/testsuite/systemtap.examples/futexes.stp
new file mode 100755
index 00000000..16c62937
--- /dev/null
+++ b/testsuite/systemtap.examples/futexes.stp
@@ -0,0 +1,36 @@
+#! /usr/bin/env stap
+
+# This script tries to identify contended user-space locks by hooking
+# into the futex system call.
+
+global thread_thislock # short
+global thread_blocktime #
+global FUTEX_WAIT = 0 /*, FUTEX_WAKE = 1 */
+
+global lock_waits # long-lived stats on (tid,lock) blockage elapsed time
+global process_names # long-lived pid-to-execname mapping
+
+probe syscall.futex {
+ if (op != FUTEX_WAIT) next # we don't care about originators of WAKE events
+ t = tid ()
+ process_names[pid()] = execname()
+ thread_thislock[t] = $uaddr
+ thread_blocktime[t] = gettimeofday_us()
+}
+
+probe syscall.futex.return {
+ t = tid()
+ ts = thread_blocktime[t]
+ if (ts) {
+ elapsed = gettimeofday_us() - ts
+ lock_waits[pid(), thread_thislock[t]] <<< elapsed
+ delete thread_blocktime[t]
+ delete thread_thislock[t]
+ }
+}
+
+probe end {
+ foreach ([pid+, lock] in lock_waits)
+ printf ("%s[%d] lock %p contended %d times, %d avg us\n",
+ process_names[pid], pid, lock, @count(lock_waits[pid,lock]), @avg(lock_waits[pid,lock]))
+}