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
13*de2ec16bSTony Jonesfrom __future__ import print_function
14*de2ec16bSTony Jones
1500204c33SArnaldo Carvalho de Meloimport os, sys
1600204c33SArnaldo Carvalho de Melosys.path.append(os.environ['PERF_EXEC_PATH'] + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
1700204c33SArnaldo Carvalho de Melofrom Util import *
1800204c33SArnaldo Carvalho de Melo
1900204c33SArnaldo Carvalho de Meloprocess_names = {}
2000204c33SArnaldo Carvalho de Melothread_thislock = {}
2100204c33SArnaldo Carvalho de Melothread_blocktime = {}
2200204c33SArnaldo Carvalho de Melo
2300204c33SArnaldo Carvalho de Melolock_waits = {} # long-lived stats on (tid,lock) blockage elapsed time
2400204c33SArnaldo Carvalho de Meloprocess_names = {} # long-lived pid-to-execname mapping
2500204c33SArnaldo Carvalho de Melo
260f5f5bcdSJoseph Schuchartdef syscalls__sys_enter_futex(event, ctxt, cpu, s, ns, tid, comm, callchain,
2700204c33SArnaldo Carvalho de Melo			      nr, uaddr, op, val, utime, uaddr2, val3):
2800204c33SArnaldo Carvalho de Melo	cmd = op & FUTEX_CMD_MASK
2900204c33SArnaldo Carvalho de Melo	if cmd != FUTEX_WAIT:
3000204c33SArnaldo Carvalho de Melo		return # we don't care about originators of WAKE events
3100204c33SArnaldo Carvalho de Melo
3200204c33SArnaldo Carvalho de Melo	process_names[tid] = comm
3300204c33SArnaldo Carvalho de Melo	thread_thislock[tid] = uaddr
3400204c33SArnaldo Carvalho de Melo	thread_blocktime[tid] = nsecs(s, ns)
3500204c33SArnaldo Carvalho de Melo
360f5f5bcdSJoseph Schuchartdef syscalls__sys_exit_futex(event, ctxt, cpu, s, ns, tid, comm, callchain,
3700204c33SArnaldo Carvalho de Melo			     nr, ret):
38*de2ec16bSTony Jones	if tid in thread_blocktime:
3900204c33SArnaldo Carvalho de Melo		elapsed = nsecs(s, ns) - thread_blocktime[tid]
4000204c33SArnaldo Carvalho de Melo		add_stats(lock_waits, (tid, thread_thislock[tid]), elapsed)
4100204c33SArnaldo Carvalho de Melo		del thread_blocktime[tid]
4200204c33SArnaldo Carvalho de Melo		del thread_thislock[tid]
4300204c33SArnaldo Carvalho de Melo
4400204c33SArnaldo Carvalho de Melodef trace_begin():
45*de2ec16bSTony Jones	print("Press control+C to stop and show the summary")
4600204c33SArnaldo Carvalho de Melo
4700204c33SArnaldo Carvalho de Melodef trace_end():
4800204c33SArnaldo Carvalho de Melo	for (tid, lock) in lock_waits:
4900204c33SArnaldo Carvalho de Melo		min, max, avg, count = lock_waits[tid, lock]
50*de2ec16bSTony Jones		print("%s[%d] lock %x contended %d times, %d avg ns" %
51*de2ec16bSTony Jones			(process_names[tid], tid, lock, count, avg))
5200204c33SArnaldo Carvalho de Melo
53