2 # (c) 2010, Arnaldo Carvalho de Melo <acme@redhat.com>
3 # Licensed under the terms of the GNU GPL License version 2
7 # http://sourceware.org/systemtap/wiki/WSFutexContention
9 # to perf python scripting.
11 # Measures futex contention
14 sys
.path
.append(os
.environ
['PERF_EXEC_PATH'] + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
21 lock_waits
= {} # long-lived stats on (tid,lock) blockage elapsed time
22 process_names
= {} # long-lived pid-to-execname mapping
24 def syscalls__sys_enter_futex(event
, ctxt
, cpu
, s
, ns
, tid
, comm
, callchain
,
25 nr
, uaddr
, op
, val
, utime
, uaddr2
, val3
):
26 cmd
= op
& FUTEX_CMD_MASK
28 return # we don't care about originators of WAKE events
30 process_names
[tid
] = comm
31 thread_thislock
[tid
] = uaddr
32 thread_blocktime
[tid
] = nsecs(s
, ns
)
34 def syscalls__sys_exit_futex(event
, ctxt
, cpu
, s
, ns
, tid
, comm
, callchain
,
36 if thread_blocktime
.has_key(tid
):
37 elapsed
= nsecs(s
, ns
) - thread_blocktime
[tid
]
38 add_stats(lock_waits
, (tid
, thread_thislock
[tid
]), elapsed
)
39 del thread_blocktime
[tid
]
40 del thread_thislock
[tid
]
43 print "Press control+C to stop and show the summary"
46 for (tid
, lock
) in lock_waits
:
47 min, max, avg
, count
= lock_waits
[tid
, lock
]
48 print "%s[%d] lock %x contended %d times, %d avg ns" % \
49 (process_names
[tid
], tid
, lock
, count
, avg
)