1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# futex contention 2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# (c) 2010, Arnaldo Carvalho de Melo <acme@redhat.com> 3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# Licensed under the terms of the GNU GPL License version 2 4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# 5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# Translation of: 6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# 7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# http://sourceware.org/systemtap/wiki/WSFutexContention 8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# 9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# to perf python scripting. 10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# 11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# Measures futex contention 12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengimport os, sys 14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsys.path.append(os.environ['PERF_EXEC_PATH'] + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengfrom Util import * 16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengprocess_names = {} 18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengthread_thislock = {} 19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengthread_blocktime = {} 20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chenglock_waits = {} # long-lived stats on (tid,lock) blockage elapsed time 22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengprocess_names = {} # long-lived pid-to-execname mapping 23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdef syscalls__sys_enter_futex(event, ctxt, cpu, s, ns, tid, comm, 25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng nr, uaddr, op, val, utime, uaddr2, val3): 26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cmd = op & FUTEX_CMD_MASK 27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if cmd != FUTEX_WAIT: 28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return # we don't care about originators of WAKE events 29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng process_names[tid] = comm 31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng thread_thislock[tid] = uaddr 32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng thread_blocktime[tid] = nsecs(s, ns) 33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdef syscalls__sys_exit_futex(event, ctxt, cpu, s, ns, tid, comm, 35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng nr, ret): 36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if thread_blocktime.has_key(tid): 37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng elapsed = nsecs(s, ns) - thread_blocktime[tid] 38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng add_stats(lock_waits, (tid, thread_thislock[tid]), elapsed) 39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng del thread_blocktime[tid] 40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng del thread_thislock[tid] 41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdef trace_begin(): 43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print "Press control+C to stop and show the summary" 44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdef trace_end(): 46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng for (tid, lock) in lock_waits: 47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng min, max, avg, count = lock_waits[tid, lock] 48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print "%s[%d] lock %x contended %d times, %d avg ns" % \ 49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng (process_names[tid], tid, lock, count, avg) 50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 51