diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2019-03-22 17:50:41 -0400 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2019-03-22 17:50:41 -0400 |
| commit | 4a98be82937325fd769cdfebf4c43dd26aa769d6 (patch) | |
| tree | 1fe6e7f6e595fda98d7cd7f0981b164e7a78fe5c /tools/perf/scripts/python/exported-sql-viewer.py | |
| parent | c634dc6bdedeb0b2c750fc611612618a85639ab2 (diff) | |
| parent | dfcbc2f2994b8a3af3605a26dc29c07ad7378bf4 (diff) | |
Merge tag 'perf-core-for-mingo-5.1-20190311' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent
Pull perf/core improvements and fixes from Arnaldo:
kernel:
Stephane Eranian :
- Restore mmap record type correctly when handling PERF_RECORD_MMAP2
events, as the same template is used for all the threads interested
in mmap events, some may want just PERF_RECORD_MMAP, while some
may want the extra info in MMAP2 records.
perf probe:
Adrian Hunter:
- Fix getting the kernel map, because since changes related to x86 PTI
entry trampolines handling, there are more than one kernel map.
perf script:
Andi Kleen:
- Support insn output for normal samples, i.e.:
perf script -F ip,sym,insn --xed
Will fetch the sample IP from the thread address space and feed it
to Intel's XED disassembler, producing lines such as:
ffffffffa4068804 native_write_msr wrmsr
ffffffffa415b95e __hrtimer_next_event_base movq 0x18(%rax), %rdx
That match 'perf annotate's output.
- Make the --cpu filter apply to PERF_RECORD_COMM/FORK/... events, in
addition to PERF_RECORD_SAMPLE.
perf report:
- Add a new --samples option to save a small random number of samples
per hist entry, using a reservoir technique to select a representative
number of samples.
Then allow browsing the samples using 'perf script' as part of the hist
entry context menu. This automatically adds the right filters, so only
the thread or CPU of the sample is displayed. Then we use less' search
functionality to directly jump to the time stamp of the selected sample.
It uses different menus for assembler and source display. Assembler
needs xed installed and source needs debuginfo.
- Fix the UI browser scripts pop up menu when there are many scripts
available.
perf report:
Andi Kleen:
- Add 'time' sort option. E.g.:
% perf report --sort time,overhead,symbol --time-quantum 1ms --stdio
...
0.67% 277061.87300 [.] _dl_start
0.50% 277061.87300 [.] f1
0.50% 277061.87300 [.] f2
0.33% 277061.87300 [.] main
0.29% 277061.87300 [.] _dl_lookup_symbol_x
0.29% 277061.87300 [.] dl_main
0.29% 277061.87300 [.] do_lookup_x
0.17% 277061.87300 [.] _dl_debug_initialize
0.17% 277061.87300 [.] _dl_init_paths
0.08% 277061.87300 [.] check_match
0.04% 277061.87300 [.] _dl_count_modids
1.33% 277061.87400 [.] f1
1.33% 277061.87400 [.] f2
1.33% 277061.87400 [.] main
1.17% 277061.87500 [.] main
1.08% 277061.87500 [.] f1
1.08% 277061.87500 [.] f2
1.00% 277061.87600 [.] main
0.83% 277061.87600 [.] f1
0.83% 277061.87600 [.] f2
1.00% 277061.87700 [.] main
tools headers:
Arnaldo Carvalho de Melo:
- Update x86's syscall_64.tbl, no change in tools/perf behaviour.
- Sync copies asm-generic/unistd.h and linux/in with the kernel sources.
perf data:
Jiri Olsa:
- Prep work to support having perf.data stored as a directory, with one
file per CPU, that ultimately will allow having one ring buffer reading
thread per CPU.
Vendor events:
Martin Liška:
- perf PMU events for AMD Family 17h.
perf script python:
Tony Jones:
- Add python3 support for the remaining Intel PT related scripts, with
these we should have a clean build of perf with python3 while still
supporting the build with python2.
libbpf:
Arnaldo Carvalho de Melo:
- Fix the build on uCLibc, adding the missing stdarg.h since we use
va_list in one typedef.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/scripts/python/exported-sql-viewer.py')
| -rwxr-xr-x | tools/perf/scripts/python/exported-sql-viewer.py | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/tools/perf/scripts/python/exported-sql-viewer.py b/tools/perf/scripts/python/exported-sql-viewer.py index afec9479ca7f..e38518cdcbc3 100755 --- a/tools/perf/scripts/python/exported-sql-viewer.py +++ b/tools/perf/scripts/python/exported-sql-viewer.py | |||
| @@ -88,11 +88,20 @@ | |||
| 88 | # 7fab593ea956 48 89 15 3b 13 22 00 movq %rdx, 0x22133b(%rip) | 88 | # 7fab593ea956 48 89 15 3b 13 22 00 movq %rdx, 0x22133b(%rip) |
| 89 | # 8107675243232 2 ls 22011 22011 hardware interrupt No 7fab593ea956 _dl_start+0x26 (ld-2.19.so) -> ffffffff86a012e0 page_fault ([kernel]) | 89 | # 8107675243232 2 ls 22011 22011 hardware interrupt No 7fab593ea956 _dl_start+0x26 (ld-2.19.so) -> ffffffff86a012e0 page_fault ([kernel]) |
| 90 | 90 | ||
| 91 | from __future__ import print_function | ||
| 92 | |||
| 91 | import sys | 93 | import sys |
| 92 | import weakref | 94 | import weakref |
| 93 | import threading | 95 | import threading |
| 94 | import string | 96 | import string |
| 95 | import cPickle | 97 | try: |
| 98 | # Python2 | ||
| 99 | import cPickle as pickle | ||
| 100 | # size of pickled integer big enough for record size | ||
| 101 | glb_nsz = 8 | ||
| 102 | except ImportError: | ||
| 103 | import pickle | ||
| 104 | glb_nsz = 16 | ||
| 96 | import re | 105 | import re |
| 97 | import os | 106 | import os |
| 98 | from PySide.QtCore import * | 107 | from PySide.QtCore import * |
| @@ -102,6 +111,15 @@ from decimal import * | |||
| 102 | from ctypes import * | 111 | from ctypes import * |
| 103 | from multiprocessing import Process, Array, Value, Event | 112 | from multiprocessing import Process, Array, Value, Event |
| 104 | 113 | ||
| 114 | # xrange is range in Python3 | ||
| 115 | try: | ||
| 116 | xrange | ||
| 117 | except NameError: | ||
| 118 | xrange = range | ||
| 119 | |||
| 120 | def printerr(*args, **keyword_args): | ||
| 121 | print(*args, file=sys.stderr, **keyword_args) | ||
| 122 | |||
| 105 | # Data formatting helpers | 123 | # Data formatting helpers |
| 106 | 124 | ||
| 107 | def tohex(ip): | 125 | def tohex(ip): |
| @@ -1004,10 +1022,6 @@ class ChildDataItemFinder(): | |||
| 1004 | 1022 | ||
| 1005 | glb_chunk_sz = 10000 | 1023 | glb_chunk_sz = 10000 |
| 1006 | 1024 | ||
| 1007 | # size of pickled integer big enough for record size | ||
| 1008 | |||
| 1009 | glb_nsz = 8 | ||
| 1010 | |||
| 1011 | # Background process for SQL data fetcher | 1025 | # Background process for SQL data fetcher |
| 1012 | 1026 | ||
| 1013 | class SQLFetcherProcess(): | 1027 | class SQLFetcherProcess(): |
| @@ -1066,7 +1080,7 @@ class SQLFetcherProcess(): | |||
| 1066 | return True | 1080 | return True |
| 1067 | if space >= glb_nsz: | 1081 | if space >= glb_nsz: |
| 1068 | # Use 0 (or space < glb_nsz) to mean there is no more at the top of the buffer | 1082 | # Use 0 (or space < glb_nsz) to mean there is no more at the top of the buffer |
| 1069 | nd = cPickle.dumps(0, cPickle.HIGHEST_PROTOCOL) | 1083 | nd = pickle.dumps(0, pickle.HIGHEST_PROTOCOL) |
| 1070 | self.buffer[self.local_head : self.local_head + len(nd)] = nd | 1084 | self.buffer[self.local_head : self.local_head + len(nd)] = nd |
| 1071 | self.local_head = 0 | 1085 | self.local_head = 0 |
| 1072 | if self.local_tail - self.local_head > sz: | 1086 | if self.local_tail - self.local_head > sz: |
| @@ -1084,9 +1098,9 @@ class SQLFetcherProcess(): | |||
| 1084 | self.wait_event.wait() | 1098 | self.wait_event.wait() |
| 1085 | 1099 | ||
| 1086 | def AddToBuffer(self, obj): | 1100 | def AddToBuffer(self, obj): |
| 1087 | d = cPickle.dumps(obj, cPickle.HIGHEST_PROTOCOL) | 1101 | d = pickle.dumps(obj, pickle.HIGHEST_PROTOCOL) |
| 1088 | n = len(d) | 1102 | n = len(d) |
| 1089 | nd = cPickle.dumps(n, cPickle.HIGHEST_PROTOCOL) | 1103 | nd = pickle.dumps(n, pickle.HIGHEST_PROTOCOL) |
| 1090 | sz = n + glb_nsz | 1104 | sz = n + glb_nsz |
| 1091 | self.WaitForSpace(sz) | 1105 | self.WaitForSpace(sz) |
| 1092 | pos = self.local_head | 1106 | pos = self.local_head |
| @@ -1198,12 +1212,12 @@ class SQLFetcher(QObject): | |||
| 1198 | pos = self.local_tail | 1212 | pos = self.local_tail |
| 1199 | if len(self.buffer) - pos < glb_nsz: | 1213 | if len(self.buffer) - pos < glb_nsz: |
| 1200 | pos = 0 | 1214 | pos = 0 |
| 1201 | n = cPickle.loads(self.buffer[pos : pos + glb_nsz]) | 1215 | n = pickle.loads(self.buffer[pos : pos + glb_nsz]) |
| 1202 | if n == 0: | 1216 | if n == 0: |
| 1203 | pos = 0 | 1217 | pos = 0 |
| 1204 | n = cPickle.loads(self.buffer[0 : glb_nsz]) | 1218 | n = pickle.loads(self.buffer[0 : glb_nsz]) |
| 1205 | pos += glb_nsz | 1219 | pos += glb_nsz |
| 1206 | obj = cPickle.loads(self.buffer[pos : pos + n]) | 1220 | obj = pickle.loads(self.buffer[pos : pos + n]) |
| 1207 | self.local_tail = pos + n | 1221 | self.local_tail = pos + n |
| 1208 | return obj | 1222 | return obj |
| 1209 | 1223 | ||
| @@ -2973,7 +2987,7 @@ class DBRef(): | |||
| 2973 | 2987 | ||
| 2974 | def Main(): | 2988 | def Main(): |
| 2975 | if (len(sys.argv) < 2): | 2989 | if (len(sys.argv) < 2): |
| 2976 | print >> sys.stderr, "Usage is: exported-sql-viewer.py {<database name> | --help-only}" | 2990 | printerr("Usage is: exported-sql-viewer.py {<database name> | --help-only}"); |
| 2977 | raise Exception("Too few arguments") | 2991 | raise Exception("Too few arguments") |
| 2978 | 2992 | ||
| 2979 | dbname = sys.argv[1] | 2993 | dbname = sys.argv[1] |
| @@ -2986,8 +3000,8 @@ def Main(): | |||
| 2986 | 3000 | ||
| 2987 | is_sqlite3 = False | 3001 | is_sqlite3 = False |
| 2988 | try: | 3002 | try: |
| 2989 | f = open(dbname) | 3003 | f = open(dbname, "rb") |
| 2990 | if f.read(15) == "SQLite format 3": | 3004 | if f.read(15) == b'SQLite format 3': |
| 2991 | is_sqlite3 = True | 3005 | is_sqlite3 = True |
| 2992 | f.close() | 3006 | f.close() |
| 2993 | except: | 3007 | except: |
