1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# futex contention
2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# (c) 2010, Arnaldo Carvalho de Melo <acme@redhat.com>
3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# Licensed under the terms of the GNU GPL License version 2
4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#
5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# Translation of:
6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#
7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# http://sourceware.org/systemtap/wiki/WSFutexContention
8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#
9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# to perf python scripting.
10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#
11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# Measures futex contention
12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengimport os, sys
14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsys.path.append(os.environ['PERF_EXEC_PATH'] + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengfrom Util import *
16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengprocess_names = {}
18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengthread_thislock = {}
19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengthread_blocktime = {}
20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chenglock_waits = {} # long-lived stats on (tid,lock) blockage elapsed time
22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengprocess_names = {} # long-lived pid-to-execname mapping
23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdef syscalls__sys_enter_futex(event, ctxt, cpu, s, ns, tid, comm,
25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			      nr, uaddr, op, val, utime, uaddr2, val3):
26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	cmd = op & FUTEX_CMD_MASK
27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	if cmd != FUTEX_WAIT:
28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		return # we don't care about originators of WAKE events
29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	process_names[tid] = comm
31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	thread_thislock[tid] = uaddr
32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	thread_blocktime[tid] = nsecs(s, ns)
33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdef syscalls__sys_exit_futex(event, ctxt, cpu, s, ns, tid, comm,
35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			     nr, ret):
36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	if thread_blocktime.has_key(tid):
37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		elapsed = nsecs(s, ns) - thread_blocktime[tid]
38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		add_stats(lock_waits, (tid, thread_thislock[tid]), elapsed)
39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		del thread_blocktime[tid]
40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		del thread_thislock[tid]
41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdef trace_begin():
43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	print "Press control+C to stop and show the summary"
44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdef trace_end():
46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	for (tid, lock) in lock_waits:
47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		min, max, avg, count = lock_waits[tid, lock]
48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		print "%s[%d] lock %x contended %d times, %d avg ns" % \
49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		      (process_names[tid], tid, lock, count, avg)
50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
51