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