# 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, callchain,
			      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, callchain,
			     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)

next.git/refs/?id=a96dfddbcc04336bbed50dc2b24823e45e09e80c'>refs</a><a href='/cgit.cgi/linux/net-next.git/log/include'>log</a><a href='/cgit.cgi/linux/net-next.git/tree/include?id=a96dfddbcc04336bbed50dc2b24823e45e09e80c'>tree</a><a href='/cgit.cgi/linux/net-next.git/commit/include?id=a96dfddbcc04336bbed50dc2b24823e45e09e80c'>commit</a><a class='active' href='/cgit.cgi/linux/net-next.git/diff/include?id=a96dfddbcc04336bbed50dc2b24823e45e09e80c'>diff</a></td><td class='form'><form class='right' method='get' action='/cgit.cgi/linux/net-next.git/log/include'>
<input type='hidden' name='id' value='a96dfddbcc04336bbed50dc2b24823e45e09e80c'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/cgit.cgi/linux/net-next.git/diff/?id=a96dfddbcc04336bbed50dc2b24823e45e09e80c'>root</a>/<a href='/cgit.cgi/linux/net-next.git/diff/include?id=a96dfddbcc04336bbed50dc2b24823e45e09e80c'>include</a></div><div class='content'><div class='cgit-panel'><b>diff options</b><form method='get'><input type='hidden' name='id' value='a96dfddbcc04336bbed50dc2b24823e45e09e80c'/><table><tr><td colspan='2'/></tr><tr><td class='label'>context:</td><td class='ctrl'><select name='context' onchange='this.form.submit();'><option value='1'>1</option><option value='2'>2</option><option value='3' selected='selected'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='15'>15</option><option value='20'>20</option><option value='25'>25</option><option value='30'>30</option><option value='35'>35</option><option value='40'>40</option></select></td></tr><tr><td class='label'>space:</td><td class='ctrl'><select name='ignorews' onchange='this.form.submit();'><option value='0' selected='selected'>include</option><option value='1'>ignore</option></select></td></tr><tr><td class='label'>mode:</td><td class='ctrl'><select name='dt' onchange='this.form.submit();'><option value='0' selected='selected'>unified</option><option value='1'>ssdiff</option><option value='2'>stat only</option></select></td></tr><tr><td/><td class='ctrl'><noscript><input type='submit' value='reload'/></noscript></td></tr></table></form></div><div class='diffstat-header'><a href='/cgit.cgi/linux/net-next.git/diff/?id=a96dfddbcc04336bbed50dc2b24823e45e09e80c'>Diffstat</a> (limited to 'include')</div><table summary='diffstat' class='diffstat'><tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit.cgi/linux/net-next.git/diff/include/linux/memory_hotplug.h?id=a96dfddbcc04336bbed50dc2b24823e45e09e80c'>include/linux/memory_hotplug.h</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='3%'><tr><td class='add' style='width: 66.7%;'/><td class='rem' style='width: 33.3%;'/><td class='none' style='width: 0.0%;'/></tr></table></td></tr>
</table><div class='diffstat-summary'>1 files changed, 2 insertions, 1 deletions</div><table summary='diff' class='diff'><tr><td><div class='head'>diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h