100204c33SArnaldo Carvalho de Melo# futex contention
200204c33SArnaldo Carvalho de Melo# (c) 2010, Arnaldo Carvalho de Melo <[email protected]>
300204c33SArnaldo Carvalho de Melo# Licensed under the terms of the GNU GPL License version 2
400204c33SArnaldo Carvalho de Melo#
500204c33SArnaldo Carvalho de Melo# Translation of:
600204c33SArnaldo Carvalho de Melo#
700204c33SArnaldo Carvalho de Melo# http://sourceware.org/systemtap/wiki/WSFutexContention
800204c33SArnaldo Carvalho de Melo#
900204c33SArnaldo Carvalho de Melo# to perf python scripting.
1000204c33SArnaldo Carvalho de Melo#
1100204c33SArnaldo Carvalho de Melo# Measures futex contention
1200204c33SArnaldo Carvalho de Melo
1300204c33SArnaldo Carvalho de Meloimport os, sys
1400204c33SArnaldo Carvalho de Melosys.path.append(os.environ['PERF_EXEC_PATH'] + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
1500204c33SArnaldo Carvalho de Melofrom Util import *
1600204c33SArnaldo Carvalho de Melo
1700204c33SArnaldo Carvalho de Meloprocess_names = {}
1800204c33SArnaldo Carvalho de Melothread_thislock = {}
1900204c33SArnaldo Carvalho de Melothread_blocktime = {}
2000204c33SArnaldo Carvalho de Melo
2100204c33SArnaldo Carvalho de Melolock_waits = {} # long-lived stats on (tid,lock) blockage elapsed time
2200204c33SArnaldo Carvalho de Meloprocess_names = {} # long-lived pid-to-execname mapping
2300204c33SArnaldo Carvalho de Melo
24*0f5f5bcdSJoseph Schuchartdef syscalls__sys_enter_futex(event, ctxt, cpu, s, ns, tid, comm, callchain,
2500204c33SArnaldo Carvalho de Melo			      nr, uaddr, op, val, utime, uaddr2, val3):
2600204c33SArnaldo Carvalho de Melo	cmd = op & FUTEX_CMD_MASK
2700204c33SArnaldo Carvalho de Melo	if cmd != FUTEX_WAIT:
2800204c33SArnaldo Carvalho de Melo		return # we don't care about originators of WAKE events
2900204c33SArnaldo Carvalho de Melo
3000204c33SArnaldo Carvalho de Melo	process_names[tid] = comm
3100204c33SArnaldo Carvalho de Melo	thread_thislock[tid] = uaddr
3200204c33SArnaldo Carvalho de Melo	thread_blocktime[tid] = nsecs(s, ns)
3300204c33SArnaldo Carvalho de Melo
34*0f5f5bcdSJoseph Schuchartdef syscalls__sys_exit_futex(event, ctxt, cpu, s, ns, tid, comm, callchain,
3500204c33SArnaldo Carvalho de Melo			     nr, ret):
3600204c33SArnaldo Carvalho de Melo	if thread_blocktime.has_key(tid):
3700204c33SArnaldo Carvalho de Melo		elapsed = nsecs(s, ns) - thread_blocktime[tid]
3800204c33SArnaldo Carvalho de Melo		add_stats(lock_waits, (tid, thread_thislock[tid]), elapsed)
3900204c33SArnaldo Carvalho de Melo		del thread_blocktime[tid]
4000204c33SArnaldo Carvalho de Melo		del thread_thislock[tid]
4100204c33SArnaldo Carvalho de Melo
4200204c33SArnaldo Carvalho de Melodef trace_begin():
4300204c33SArnaldo Carvalho de Melo	print "Press control+C to stop and show the summary"
4400204c33SArnaldo Carvalho de Melo
4500204c33SArnaldo Carvalho de Melodef trace_end():
4600204c33SArnaldo Carvalho de Melo	for (tid, lock) in lock_waits:
4700204c33SArnaldo Carvalho de Melo		min, max, avg, count = lock_waits[tid, lock]
4800204c33SArnaldo Carvalho de Melo		print "%s[%d] lock %x contended %d times, %d avg ns" % \
4900204c33SArnaldo Carvalho de Melo		      (process_names[tid], tid, lock, count, avg)
5000204c33SArnaldo Carvalho de Melo
51