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