summaryrefslogtreecommitdiff
path: root/tools/perf/scripts/python/futex-contention.py
blob: 7e884d46f92066fcfd29f5a3222f90bbdd0640e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 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

from __future__ import print_function

import os
import 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 tid in thread_blocktime:
        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 [max: %d ns, min %d ns]" %
              (process_names[tid], tid, lock, count, avg, max, min))
mit/tools/perf/scripts/python/export-to-postgresql.py?id=07c5ebead85f507271fb8e2a8b5814e486702518'>perf scripts python: export-to-postgresql.py: Fix invalid input syntax for in...Adrian Hunter 2019-02-06perf thread-stack: Represent jmps to the start of a different symbolAdrian Hunter 2018-10-23perf scripts python: call-graph-from-sql.py: Rename to exported-sql-viewer.pyAdrian Hunter 2018-09-25perf script python: Fix export-to-postgresql.py occasional failureAdrian Hunter 2017-08-15perf script python: Rename call-graph-from-postgresql.py to call-graph-from-s...Adrian Hunter 2017-08-15perf scripts python: Fix missing call_path_id in export-to-postgresql scriptAdrian Hunter 2016-05-06perf script: Update export-to-postgresql to support callchain exportChris Phlipot 2016-04-19perf script: Fix postgresql ubuntu install instructionsChris Phlipot 2015-09-28perf tools: Add more documentation to export-to-postgresql.py scriptAdrian Hunter 2015-08-21perf tools: Add example call-graph scriptAdrian Hunter 2014-11-03perf tools: Add call information to Python exportAdrian Hunter 2014-11-03perf tools: Add branch_type and in_tx to Python exportAdrian Hunter 2014-10-29perf script: Add Python script to export to postgresqlAdrian Hunter