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 13de2ec16bSTony Jonesfrom __future__ import print_function 14de2ec16bSTony Jones 152a684fcbSHagen Paul Pfeiferimport os 162a684fcbSHagen Paul Pfeiferimport sys 172a684fcbSHagen Paul Pfeifersys.path.append(os.environ['PERF_EXEC_PATH'] + 182a684fcbSHagen Paul Pfeifer '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 1900204c33SArnaldo Carvalho de Melofrom Util import * 2000204c33SArnaldo Carvalho de Melo 2100204c33SArnaldo Carvalho de Meloprocess_names = {} 2200204c33SArnaldo Carvalho de Melothread_thislock = {} 2300204c33SArnaldo Carvalho de Melothread_blocktime = {} 2400204c33SArnaldo Carvalho de Melo 2500204c33SArnaldo Carvalho de Melolock_waits = {} # long-lived stats on (tid,lock) blockage elapsed time 2600204c33SArnaldo Carvalho de Meloprocess_names = {} # long-lived pid-to-execname mapping 2700204c33SArnaldo Carvalho de Melo 282a684fcbSHagen Paul Pfeifer 290f5f5bcdSJoseph Schuchartdef syscalls__sys_enter_futex(event, ctxt, cpu, s, ns, tid, comm, callchain, 3000204c33SArnaldo Carvalho de Melo nr, uaddr, op, val, utime, uaddr2, val3): 3100204c33SArnaldo Carvalho de Melo cmd = op & FUTEX_CMD_MASK 3200204c33SArnaldo Carvalho de Melo if cmd != FUTEX_WAIT: 3300204c33SArnaldo Carvalho de Melo return # we don't care about originators of WAKE events 3400204c33SArnaldo Carvalho de Melo 3500204c33SArnaldo Carvalho de Melo process_names[tid] = comm 3600204c33SArnaldo Carvalho de Melo thread_thislock[tid] = uaddr 3700204c33SArnaldo Carvalho de Melo thread_blocktime[tid] = nsecs(s, ns) 3800204c33SArnaldo Carvalho de Melo 392a684fcbSHagen Paul Pfeifer 400f5f5bcdSJoseph Schuchartdef syscalls__sys_exit_futex(event, ctxt, cpu, s, ns, tid, comm, callchain, 4100204c33SArnaldo Carvalho de Melo nr, ret): 42de2ec16bSTony Jones if tid in thread_blocktime: 4300204c33SArnaldo Carvalho de Melo elapsed = nsecs(s, ns) - thread_blocktime[tid] 4400204c33SArnaldo Carvalho de Melo add_stats(lock_waits, (tid, thread_thislock[tid]), elapsed) 4500204c33SArnaldo Carvalho de Melo del thread_blocktime[tid] 4600204c33SArnaldo Carvalho de Melo del thread_thislock[tid] 4700204c33SArnaldo Carvalho de Melo 482a684fcbSHagen Paul Pfeifer 4900204c33SArnaldo Carvalho de Melodef trace_begin(): 50de2ec16bSTony Jones print("Press control+C to stop and show the summary") 5100204c33SArnaldo Carvalho de Melo 522a684fcbSHagen Paul Pfeifer 5300204c33SArnaldo Carvalho de Melodef trace_end(): 5400204c33SArnaldo Carvalho de Melo for (tid, lock) in lock_waits: 5500204c33SArnaldo Carvalho de Melo min, max, avg, count = lock_waits[tid, lock] 56*69f48c70SHagen Paul Pfeifer print("%s[%d] lock %x contended %d times, %d avg ns [max: %d ns, min %d ns]" % 57*69f48c70SHagen Paul Pfeifer (process_names[tid], tid, lock, count, avg, max, min)) 58