diff options
Diffstat (limited to 'tools/perf/scripts/python')
4 files changed, 74 insertions, 0 deletions
| diff --git a/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py index 99ff1b7a0d2c..13cc02b5893a 100644 --- a/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py +++ b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py @@ -8,6 +8,12 @@  import errno, os +FUTEX_WAIT = 0 +FUTEX_WAKE = 1 +FUTEX_PRIVATE_FLAG = 128 +FUTEX_CLOCK_REALTIME = 256 +FUTEX_CMD_MASK = ~(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME) +  NSECS_PER_SEC    = 1000000000  def avg(total, n): @@ -26,6 +32,18 @@ def nsecs_str(nsecs):      str = "%5u.%09u" % (nsecs_secs(nsecs), nsecs_nsecs(nsecs)),      return str +def add_stats(dict, key, value): +	if not dict.has_key(key): +		dict[key] = (value, value, value, 1) +	else: +		min, max, avg, count = dict[key] +		if value < min: +			min = value +		if value > max: +			max = value +		avg = (avg + value) / 2 +		dict[key] = (min, max, avg, count + 1) +  def clear_term():      print("\x1b[H\x1b[2J") diff --git a/tools/perf/scripts/python/bin/futex-contention-record b/tools/perf/scripts/python/bin/futex-contention-record new file mode 100644 index 000000000000..5ecbb433caf4 --- /dev/null +++ b/tools/perf/scripts/python/bin/futex-contention-record @@ -0,0 +1,2 @@ +#!/bin/bash +perf record -a -e syscalls:sys_enter_futex -e syscalls:sys_exit_futex $@ diff --git a/tools/perf/scripts/python/bin/futex-contention-report b/tools/perf/scripts/python/bin/futex-contention-report new file mode 100644 index 000000000000..c8268138fb7e --- /dev/null +++ b/tools/perf/scripts/python/bin/futex-contention-report @@ -0,0 +1,4 @@ +#!/bin/bash +# description: futext contention measurement + +perf trace $@ -s "$PERF_EXEC_PATH"/scripts/python/futex-contention.py diff --git a/tools/perf/scripts/python/futex-contention.py b/tools/perf/scripts/python/futex-contention.py new file mode 100644 index 000000000000..11e70a388d41 --- /dev/null +++ b/tools/perf/scripts/python/futex-contention.py @@ -0,0 +1,50 @@ +# futex contention +# (c) 2010, Arnaldo Carvalho de Melo <acme@redhat.com> +# Licensed under the terms of the GNU GPL License version 2 +# +# Translation of: +# +# http://sourceware.org/systemtap/wiki/WSFutexContention +# +# to perf python scripting. +# +# Measures futex contention + +import os, sys +sys.path.append(os.environ['PERF_EXEC_PATH'] + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') +from Util import * + +process_names = {} +thread_thislock = {} +thread_blocktime = {} + +lock_waits = {} # long-lived stats on (tid,lock) blockage elapsed time +process_names = {} # long-lived pid-to-execname mapping + +def syscalls__sys_enter_futex(event, ctxt, cpu, s, ns, tid, comm, +			      nr, uaddr, op, val, utime, uaddr2, val3): +	cmd = op & FUTEX_CMD_MASK +	if cmd != FUTEX_WAIT: +		return # we don't care about originators of WAKE events + +	process_names[tid] = comm +	thread_thislock[tid] = uaddr +	thread_blocktime[tid] = nsecs(s, ns) + +def syscalls__sys_exit_futex(event, ctxt, cpu, s, ns, tid, comm, +			     nr, ret): +	if thread_blocktime.has_key(tid): +		elapsed = nsecs(s, ns) - thread_blocktime[tid] +		add_stats(lock_waits, (tid, thread_thislock[tid]), elapsed) +		del thread_blocktime[tid] +		del thread_thislock[tid] + +def trace_begin(): +	print "Press control+C to stop and show the summary" + +def trace_end(): +	for (tid, lock) in lock_waits: +		min, max, avg, count = lock_waits[tid, lock] +		print "%s[%d] lock %x contended %d times, %d avg ns" % \ +		      (process_names[tid], tid, lock, count, avg) + | 
