blob: 7e884d46f92066fcfd29f5a3222f90bbdd0640e4 [file] [log] [blame]
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001# futex contention
2# (c) 2010, Arnaldo Carvalho de Melo <acme@redhat.com>
3# Licensed under the terms of the GNU GPL License version 2
4#
5# Translation of:
6#
7# http://sourceware.org/systemtap/wiki/WSFutexContention
8#
9# to perf python scripting.
10#
11# Measures futex contention
12
David Brazdil0f672f62019-12-10 10:32:29 +000013from __future__ import print_function
14
Olivier Deprez157378f2022-04-04 15:47:50 +020015import os
16import sys
17sys.path.append(os.environ['PERF_EXEC_PATH'] +
18 '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000019from Util import *
20
21process_names = {}
22thread_thislock = {}
23thread_blocktime = {}
24
Olivier Deprez157378f2022-04-04 15:47:50 +020025lock_waits = {} # long-lived stats on (tid,lock) blockage elapsed time
26process_names = {} # long-lived pid-to-execname mapping
27
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000028
29def syscalls__sys_enter_futex(event, ctxt, cpu, s, ns, tid, comm, callchain,
Olivier Deprez157378f2022-04-04 15:47:50 +020030 nr, uaddr, op, val, utime, uaddr2, val3):
31 cmd = op & FUTEX_CMD_MASK
32 if cmd != FUTEX_WAIT:
33 return # we don't care about originators of WAKE events
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000034
Olivier Deprez157378f2022-04-04 15:47:50 +020035 process_names[tid] = comm
36 thread_thislock[tid] = uaddr
37 thread_blocktime[tid] = nsecs(s, ns)
38
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000039
40def syscalls__sys_exit_futex(event, ctxt, cpu, s, ns, tid, comm, callchain,
Olivier Deprez157378f2022-04-04 15:47:50 +020041 nr, ret):
42 if tid in thread_blocktime:
43 elapsed = nsecs(s, ns) - thread_blocktime[tid]
44 add_stats(lock_waits, (tid, thread_thislock[tid]), elapsed)
45 del thread_blocktime[tid]
46 del thread_thislock[tid]
47
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000048
49def trace_begin():
Olivier Deprez157378f2022-04-04 15:47:50 +020050 print("Press control+C to stop and show the summary")
51
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000052
53def trace_end():
Olivier Deprez157378f2022-04-04 15:47:50 +020054 for (tid, lock) in lock_waits:
55 min, max, avg, count = lock_waits[tid, lock]
56 print("%s[%d] lock %x contended %d times, %d avg ns [max: %d ns, min %d ns]" %
57 (process_names[tid], tid, lock, count, avg, max, min))