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