1564b9527SAdrian Hunter# export-to-sqlite.py: export perf data to a sqlite3 database 2564b9527SAdrian Hunter# Copyright (c) 2017, Intel Corporation. 3564b9527SAdrian Hunter# 4564b9527SAdrian Hunter# This program is free software; you can redistribute it and/or modify it 5564b9527SAdrian Hunter# under the terms and conditions of the GNU General Public License, 6564b9527SAdrian Hunter# version 2, as published by the Free Software Foundation. 7564b9527SAdrian Hunter# 8564b9527SAdrian Hunter# This program is distributed in the hope it will be useful, but WITHOUT 9564b9527SAdrian Hunter# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10564b9527SAdrian Hunter# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11564b9527SAdrian Hunter# more details. 12564b9527SAdrian Hunter 13ebf6c5c1STony Jonesfrom __future__ import print_function 14ebf6c5c1STony Jones 15564b9527SAdrian Hunterimport os 16564b9527SAdrian Hunterimport sys 17564b9527SAdrian Hunterimport struct 18564b9527SAdrian Hunterimport datetime 19564b9527SAdrian Hunter 20564b9527SAdrian Hunter# To use this script you will need to have installed package python-pyside which 21564b9527SAdrian Hunter# provides LGPL-licensed Python bindings for Qt. You will also need the package 22564b9527SAdrian Hunter# libqt4-sql-sqlite for Qt sqlite3 support. 23564b9527SAdrian Hunter# 24bfb3170eSAdrian Hunter# Examples of installing pyside: 25bfb3170eSAdrian Hunter# 26bfb3170eSAdrian Hunter# ubuntu: 27bfb3170eSAdrian Hunter# 28bfb3170eSAdrian Hunter# $ sudo apt-get install python-pyside.qtsql libqt4-sql-psql 29bfb3170eSAdrian Hunter# 30bfb3170eSAdrian Hunter# Alternately, to use Python3 and/or pyside 2, one of the following: 31bfb3170eSAdrian Hunter# 32bfb3170eSAdrian Hunter# $ sudo apt-get install python3-pyside.qtsql libqt4-sql-psql 33bfb3170eSAdrian Hunter# $ sudo apt-get install python-pyside2.qtsql libqt5sql5-psql 34bfb3170eSAdrian Hunter# $ sudo apt-get install python3-pyside2.qtsql libqt5sql5-psql 35bfb3170eSAdrian Hunter# fedora: 36bfb3170eSAdrian Hunter# 37bfb3170eSAdrian Hunter# $ sudo yum install python-pyside 38bfb3170eSAdrian Hunter# 39bfb3170eSAdrian Hunter# Alternately, to use Python3 and/or pyside 2, one of the following: 40bfb3170eSAdrian Hunter# $ sudo yum install python3-pyside 41bfb3170eSAdrian Hunter# $ pip install --user PySide2 42bfb3170eSAdrian Hunter# $ pip3 install --user PySide2 43bfb3170eSAdrian Hunter# 44564b9527SAdrian Hunter# An example of using this script with Intel PT: 45564b9527SAdrian Hunter# 46564b9527SAdrian Hunter# $ perf record -e intel_pt//u ls 47564b9527SAdrian Hunter# $ perf script -s ~/libexec/perf-core/scripts/python/export-to-sqlite.py pt_example branches calls 48564b9527SAdrian Hunter# 2017-07-31 14:26:07.326913 Creating database... 49564b9527SAdrian Hunter# 2017-07-31 14:26:07.538097 Writing records... 50564b9527SAdrian Hunter# 2017-07-31 14:26:09.889292 Adding indexes 51564b9527SAdrian Hunter# 2017-07-31 14:26:09.958746 Done 52564b9527SAdrian Hunter# 53564b9527SAdrian Hunter# To browse the database, sqlite3 can be used e.g. 54564b9527SAdrian Hunter# 55564b9527SAdrian Hunter# $ sqlite3 pt_example 56564b9527SAdrian Hunter# sqlite> .header on 57564b9527SAdrian Hunter# sqlite> select * from samples_view where id < 10; 58564b9527SAdrian Hunter# sqlite> .mode column 59564b9527SAdrian Hunter# sqlite> select * from samples_view where id < 10; 60564b9527SAdrian Hunter# sqlite> .tables 61564b9527SAdrian Hunter# sqlite> .schema samples_view 62564b9527SAdrian Hunter# sqlite> .quit 63564b9527SAdrian Hunter# 64564b9527SAdrian Hunter# An example of using the database is provided by the script 65031c2a00SAdrian Hunter# exported-sql-viewer.py. Refer to that script for details. 66564b9527SAdrian Hunter# 67564b9527SAdrian Hunter# The database structure is practically the same as created by the script 68564b9527SAdrian Hunter# export-to-postgresql.py. Refer to that script for details. A notable 69564b9527SAdrian Hunter# difference is the 'transaction' column of the 'samples' table which is 70564b9527SAdrian Hunter# renamed 'transaction_' in sqlite because 'transaction' is a reserved word. 71564b9527SAdrian Hunter 72bfb3170eSAdrian Hunterpyside_version_1 = True 73bfb3170eSAdrian Hunterif not "pyside-version-1" in sys.argv: 74bfb3170eSAdrian Hunter try: 75bfb3170eSAdrian Hunter from PySide2.QtSql import * 76bfb3170eSAdrian Hunter pyside_version_1 = False 77bfb3170eSAdrian Hunter except: 78bfb3170eSAdrian Hunter pass 79bfb3170eSAdrian Hunter 80bfb3170eSAdrian Hunterif pyside_version_1: 81564b9527SAdrian Hunter from PySide.QtSql import * 82564b9527SAdrian Hunter 83564b9527SAdrian Huntersys.path.append(os.environ['PERF_EXEC_PATH'] + \ 84564b9527SAdrian Hunter '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 85564b9527SAdrian Hunter 86564b9527SAdrian Hunter# These perf imports are not used at present 87564b9527SAdrian Hunter#from perf_trace_context import * 88564b9527SAdrian Hunter#from Core import * 89564b9527SAdrian Hunter 90564b9527SAdrian Hunterperf_db_export_mode = True 91564b9527SAdrian Hunterperf_db_export_calls = False 92564b9527SAdrian Hunterperf_db_export_callchains = False 93564b9527SAdrian Hunter 94ebf6c5c1STony Jonesdef printerr(*args, **keyword_args): 95ebf6c5c1STony Jones print(*args, file=sys.stderr, **keyword_args) 96ebf6c5c1STony Jones 9749f93bbfSTony Jonesdef printdate(*args, **kw_args): 9849f93bbfSTony Jones print(datetime.datetime.today(), *args, sep=' ', **kw_args) 9949f93bbfSTony Jones 100564b9527SAdrian Hunterdef usage(): 101bfb3170eSAdrian Hunter printerr("Usage is: export-to-sqlite.py <database name> [<columns>] [<calls>] [<callchains>] [<pyside-version-1>]"); 102ebf6c5c1STony Jones printerr("where: columns 'all' or 'branches'"); 103ebf6c5c1STony Jones printerr(" calls 'calls' => create calls and call_paths table"); 104ebf6c5c1STony Jones printerr(" callchains 'callchains' => create call_paths table"); 105bfb3170eSAdrian Hunter printerr(" pyside-version-1 'pyside-version-1' => use pyside version 1"); 106bfb3170eSAdrian Hunter raise Exception("Too few or bad arguments") 107564b9527SAdrian Hunter 108564b9527SAdrian Hunterif (len(sys.argv) < 2): 109564b9527SAdrian Hunter usage() 110564b9527SAdrian Hunter 111564b9527SAdrian Hunterdbname = sys.argv[1] 112564b9527SAdrian Hunter 113564b9527SAdrian Hunterif (len(sys.argv) >= 3): 114564b9527SAdrian Hunter columns = sys.argv[2] 115564b9527SAdrian Hunterelse: 116564b9527SAdrian Hunter columns = "all" 117564b9527SAdrian Hunter 118564b9527SAdrian Hunterif columns not in ("all", "branches"): 119564b9527SAdrian Hunter usage() 120564b9527SAdrian Hunter 121564b9527SAdrian Hunterbranches = (columns == "branches") 122564b9527SAdrian Hunter 123564b9527SAdrian Hunterfor i in range(3,len(sys.argv)): 124564b9527SAdrian Hunter if (sys.argv[i] == "calls"): 125564b9527SAdrian Hunter perf_db_export_calls = True 126564b9527SAdrian Hunter elif (sys.argv[i] == "callchains"): 127564b9527SAdrian Hunter perf_db_export_callchains = True 128bfb3170eSAdrian Hunter elif (sys.argv[i] == "pyside-version-1"): 129bfb3170eSAdrian Hunter pass 130564b9527SAdrian Hunter else: 131564b9527SAdrian Hunter usage() 132564b9527SAdrian Hunter 133564b9527SAdrian Hunterdef do_query(q, s): 134564b9527SAdrian Hunter if (q.exec_(s)): 135564b9527SAdrian Hunter return 136564b9527SAdrian Hunter raise Exception("Query failed: " + q.lastError().text()) 137564b9527SAdrian Hunter 138564b9527SAdrian Hunterdef do_query_(q): 139564b9527SAdrian Hunter if (q.exec_()): 140564b9527SAdrian Hunter return 141564b9527SAdrian Hunter raise Exception("Query failed: " + q.lastError().text()) 142564b9527SAdrian Hunter 14349f93bbfSTony Jonesprintdate("Creating database ...") 144564b9527SAdrian Hunter 145564b9527SAdrian Hunterdb_exists = False 146564b9527SAdrian Huntertry: 147564b9527SAdrian Hunter f = open(dbname) 148564b9527SAdrian Hunter f.close() 149564b9527SAdrian Hunter db_exists = True 150564b9527SAdrian Hunterexcept: 151564b9527SAdrian Hunter pass 152564b9527SAdrian Hunter 153564b9527SAdrian Hunterif db_exists: 154564b9527SAdrian Hunter raise Exception(dbname + " already exists") 155564b9527SAdrian Hunter 156564b9527SAdrian Hunterdb = QSqlDatabase.addDatabase('QSQLITE') 157564b9527SAdrian Hunterdb.setDatabaseName(dbname) 158564b9527SAdrian Hunterdb.open() 159564b9527SAdrian Hunter 160564b9527SAdrian Hunterquery = QSqlQuery(db) 161564b9527SAdrian Hunter 162564b9527SAdrian Hunterdo_query(query, 'PRAGMA journal_mode = OFF') 163564b9527SAdrian Hunterdo_query(query, 'BEGIN TRANSACTION') 164564b9527SAdrian Hunter 165564b9527SAdrian Hunterdo_query(query, 'CREATE TABLE selected_events (' 166564b9527SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 167564b9527SAdrian Hunter 'name varchar(80))') 168564b9527SAdrian Hunterdo_query(query, 'CREATE TABLE machines (' 169564b9527SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 170564b9527SAdrian Hunter 'pid integer,' 171564b9527SAdrian Hunter 'root_dir varchar(4096))') 172564b9527SAdrian Hunterdo_query(query, 'CREATE TABLE threads (' 173564b9527SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 174564b9527SAdrian Hunter 'machine_id bigint,' 175564b9527SAdrian Hunter 'process_id bigint,' 176564b9527SAdrian Hunter 'pid integer,' 177564b9527SAdrian Hunter 'tid integer)') 178564b9527SAdrian Hunterdo_query(query, 'CREATE TABLE comms (' 179564b9527SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 18041085f2bSAdrian Hunter 'comm varchar(16),' 18141085f2bSAdrian Hunter 'c_thread_id bigint,' 18241085f2bSAdrian Hunter 'c_time bigint,' 18341085f2bSAdrian Hunter 'exec_flag boolean)') 184564b9527SAdrian Hunterdo_query(query, 'CREATE TABLE comm_threads (' 185564b9527SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 186564b9527SAdrian Hunter 'comm_id bigint,' 187564b9527SAdrian Hunter 'thread_id bigint)') 188564b9527SAdrian Hunterdo_query(query, 'CREATE TABLE dsos (' 189564b9527SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 190564b9527SAdrian Hunter 'machine_id bigint,' 191564b9527SAdrian Hunter 'short_name varchar(256),' 192564b9527SAdrian Hunter 'long_name varchar(4096),' 193564b9527SAdrian Hunter 'build_id varchar(64))') 194564b9527SAdrian Hunterdo_query(query, 'CREATE TABLE symbols (' 195564b9527SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 196564b9527SAdrian Hunter 'dso_id bigint,' 197564b9527SAdrian Hunter 'sym_start bigint,' 198564b9527SAdrian Hunter 'sym_end bigint,' 199564b9527SAdrian Hunter 'binding integer,' 200564b9527SAdrian Hunter 'name varchar(2048))') 201564b9527SAdrian Hunterdo_query(query, 'CREATE TABLE branch_types (' 202564b9527SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 203564b9527SAdrian Hunter 'name varchar(80))') 204564b9527SAdrian Hunter 205564b9527SAdrian Hunterif branches: 206564b9527SAdrian Hunter do_query(query, 'CREATE TABLE samples (' 207564b9527SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 208564b9527SAdrian Hunter 'evsel_id bigint,' 209564b9527SAdrian Hunter 'machine_id bigint,' 210564b9527SAdrian Hunter 'thread_id bigint,' 211564b9527SAdrian Hunter 'comm_id bigint,' 212564b9527SAdrian Hunter 'dso_id bigint,' 213564b9527SAdrian Hunter 'symbol_id bigint,' 214564b9527SAdrian Hunter 'sym_offset bigint,' 215564b9527SAdrian Hunter 'ip bigint,' 216564b9527SAdrian Hunter 'time bigint,' 217564b9527SAdrian Hunter 'cpu integer,' 218564b9527SAdrian Hunter 'to_dso_id bigint,' 219564b9527SAdrian Hunter 'to_symbol_id bigint,' 220564b9527SAdrian Hunter 'to_sym_offset bigint,' 221564b9527SAdrian Hunter 'to_ip bigint,' 222564b9527SAdrian Hunter 'branch_type integer,' 223564b9527SAdrian Hunter 'in_tx boolean,' 22464adadb3SAdrian Hunter 'call_path_id bigint,' 22564adadb3SAdrian Hunter 'insn_count bigint,' 226*761836cbSAdrian Hunter 'cyc_count bigint,' 227*761836cbSAdrian Hunter 'flags integer)') 228564b9527SAdrian Hunterelse: 229564b9527SAdrian Hunter do_query(query, 'CREATE TABLE samples (' 230564b9527SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 231564b9527SAdrian Hunter 'evsel_id bigint,' 232564b9527SAdrian Hunter 'machine_id bigint,' 233564b9527SAdrian Hunter 'thread_id bigint,' 234564b9527SAdrian Hunter 'comm_id bigint,' 235564b9527SAdrian Hunter 'dso_id bigint,' 236564b9527SAdrian Hunter 'symbol_id bigint,' 237564b9527SAdrian Hunter 'sym_offset bigint,' 238564b9527SAdrian Hunter 'ip bigint,' 239564b9527SAdrian Hunter 'time bigint,' 240564b9527SAdrian Hunter 'cpu integer,' 241564b9527SAdrian Hunter 'to_dso_id bigint,' 242564b9527SAdrian Hunter 'to_symbol_id bigint,' 243564b9527SAdrian Hunter 'to_sym_offset bigint,' 244564b9527SAdrian Hunter 'to_ip bigint,' 245564b9527SAdrian Hunter 'period bigint,' 246564b9527SAdrian Hunter 'weight bigint,' 247564b9527SAdrian Hunter 'transaction_ bigint,' 248564b9527SAdrian Hunter 'data_src bigint,' 249564b9527SAdrian Hunter 'branch_type integer,' 250564b9527SAdrian Hunter 'in_tx boolean,' 25164adadb3SAdrian Hunter 'call_path_id bigint,' 25264adadb3SAdrian Hunter 'insn_count bigint,' 253*761836cbSAdrian Hunter 'cyc_count bigint,' 254*761836cbSAdrian Hunter 'flags integer)') 255564b9527SAdrian Hunter 256564b9527SAdrian Hunterif perf_db_export_calls or perf_db_export_callchains: 257564b9527SAdrian Hunter do_query(query, 'CREATE TABLE call_paths (' 258564b9527SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 259564b9527SAdrian Hunter 'parent_id bigint,' 260564b9527SAdrian Hunter 'symbol_id bigint,' 261564b9527SAdrian Hunter 'ip bigint)') 262564b9527SAdrian Hunterif perf_db_export_calls: 263564b9527SAdrian Hunter do_query(query, 'CREATE TABLE calls (' 264564b9527SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 265564b9527SAdrian Hunter 'thread_id bigint,' 266564b9527SAdrian Hunter 'comm_id bigint,' 267564b9527SAdrian Hunter 'call_path_id bigint,' 268564b9527SAdrian Hunter 'call_time bigint,' 269564b9527SAdrian Hunter 'return_time bigint,' 270564b9527SAdrian Hunter 'branch_count bigint,' 271564b9527SAdrian Hunter 'call_id bigint,' 272564b9527SAdrian Hunter 'return_id bigint,' 273564b9527SAdrian Hunter 'parent_call_path_id bigint,' 2748ce9a725SAdrian Hunter 'flags integer,' 27564adadb3SAdrian Hunter 'parent_id bigint,' 27664adadb3SAdrian Hunter 'insn_count bigint,' 27764adadb3SAdrian Hunter 'cyc_count bigint)') 278564b9527SAdrian Hunter 2795130c6e5SAdrian Hunterdo_query(query, 'CREATE TABLE ptwrite (' 2805130c6e5SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 2815130c6e5SAdrian Hunter 'payload bigint,' 2825130c6e5SAdrian Hunter 'exact_ip integer)') 2835130c6e5SAdrian Hunter 2845130c6e5SAdrian Hunterdo_query(query, 'CREATE TABLE cbr (' 2855130c6e5SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 2865130c6e5SAdrian Hunter 'cbr integer,' 2875130c6e5SAdrian Hunter 'mhz integer,' 2885130c6e5SAdrian Hunter 'percent integer)') 2895130c6e5SAdrian Hunter 2905130c6e5SAdrian Hunterdo_query(query, 'CREATE TABLE mwait (' 2915130c6e5SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 2925130c6e5SAdrian Hunter 'hints integer,' 2935130c6e5SAdrian Hunter 'extensions integer)') 2945130c6e5SAdrian Hunter 2955130c6e5SAdrian Hunterdo_query(query, 'CREATE TABLE pwre (' 2965130c6e5SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 2975130c6e5SAdrian Hunter 'cstate integer,' 2985130c6e5SAdrian Hunter 'subcstate integer,' 2995130c6e5SAdrian Hunter 'hw integer)') 3005130c6e5SAdrian Hunter 3015130c6e5SAdrian Hunterdo_query(query, 'CREATE TABLE exstop (' 3025130c6e5SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 3035130c6e5SAdrian Hunter 'exact_ip integer)') 3045130c6e5SAdrian Hunter 3055130c6e5SAdrian Hunterdo_query(query, 'CREATE TABLE pwrx (' 3065130c6e5SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 3075130c6e5SAdrian Hunter 'deepest_cstate integer,' 3085130c6e5SAdrian Hunter 'last_cstate integer,' 3095130c6e5SAdrian Hunter 'wake_reason integer)') 3105130c6e5SAdrian Hunter 31137c1f991SAdrian Hunterdo_query(query, 'CREATE TABLE context_switches (' 31237c1f991SAdrian Hunter 'id integer NOT NULL PRIMARY KEY,' 31337c1f991SAdrian Hunter 'machine_id bigint,' 31437c1f991SAdrian Hunter 'time bigint,' 31537c1f991SAdrian Hunter 'cpu integer,' 31637c1f991SAdrian Hunter 'thread_out_id bigint,' 31737c1f991SAdrian Hunter 'comm_out_id bigint,' 31837c1f991SAdrian Hunter 'thread_in_id bigint,' 31937c1f991SAdrian Hunter 'comm_in_id bigint,' 32037c1f991SAdrian Hunter 'flags integer)') 32137c1f991SAdrian Hunter 322564b9527SAdrian Hunter# printf was added to sqlite in version 3.8.3 323564b9527SAdrian Huntersqlite_has_printf = False 324564b9527SAdrian Huntertry: 325564b9527SAdrian Hunter do_query(query, 'SELECT printf("") FROM machines') 326564b9527SAdrian Hunter sqlite_has_printf = True 327564b9527SAdrian Hunterexcept: 328564b9527SAdrian Hunter pass 329564b9527SAdrian Hunter 330564b9527SAdrian Hunterdef emit_to_hex(x): 331564b9527SAdrian Hunter if sqlite_has_printf: 332564b9527SAdrian Hunter return 'printf("%x", ' + x + ')' 333564b9527SAdrian Hunter else: 334564b9527SAdrian Hunter return x 335564b9527SAdrian Hunter 336564b9527SAdrian Hunterdo_query(query, 'CREATE VIEW machines_view AS ' 337564b9527SAdrian Hunter 'SELECT ' 338564b9527SAdrian Hunter 'id,' 339564b9527SAdrian Hunter 'pid,' 340564b9527SAdrian Hunter 'root_dir,' 341564b9527SAdrian Hunter 'CASE WHEN id=0 THEN \'unknown\' WHEN pid=-1 THEN \'host\' ELSE \'guest\' END AS host_or_guest' 342564b9527SAdrian Hunter ' FROM machines') 343564b9527SAdrian Hunter 344564b9527SAdrian Hunterdo_query(query, 'CREATE VIEW dsos_view AS ' 345564b9527SAdrian Hunter 'SELECT ' 346564b9527SAdrian Hunter 'id,' 347564b9527SAdrian Hunter 'machine_id,' 348564b9527SAdrian Hunter '(SELECT host_or_guest FROM machines_view WHERE id = machine_id) AS host_or_guest,' 349564b9527SAdrian Hunter 'short_name,' 350564b9527SAdrian Hunter 'long_name,' 351564b9527SAdrian Hunter 'build_id' 352564b9527SAdrian Hunter ' FROM dsos') 353564b9527SAdrian Hunter 354564b9527SAdrian Hunterdo_query(query, 'CREATE VIEW symbols_view AS ' 355564b9527SAdrian Hunter 'SELECT ' 356564b9527SAdrian Hunter 'id,' 357564b9527SAdrian Hunter 'name,' 358564b9527SAdrian Hunter '(SELECT short_name FROM dsos WHERE id=dso_id) AS dso,' 359564b9527SAdrian Hunter 'dso_id,' 360564b9527SAdrian Hunter 'sym_start,' 361564b9527SAdrian Hunter 'sym_end,' 362564b9527SAdrian Hunter 'CASE WHEN binding=0 THEN \'local\' WHEN binding=1 THEN \'global\' ELSE \'weak\' END AS binding' 363564b9527SAdrian Hunter ' FROM symbols') 364564b9527SAdrian Hunter 365564b9527SAdrian Hunterdo_query(query, 'CREATE VIEW threads_view AS ' 366564b9527SAdrian Hunter 'SELECT ' 367564b9527SAdrian Hunter 'id,' 368564b9527SAdrian Hunter 'machine_id,' 369564b9527SAdrian Hunter '(SELECT host_or_guest FROM machines_view WHERE id = machine_id) AS host_or_guest,' 370564b9527SAdrian Hunter 'process_id,' 371564b9527SAdrian Hunter 'pid,' 372564b9527SAdrian Hunter 'tid' 373564b9527SAdrian Hunter ' FROM threads') 374564b9527SAdrian Hunter 375564b9527SAdrian Hunterdo_query(query, 'CREATE VIEW comm_threads_view AS ' 376564b9527SAdrian Hunter 'SELECT ' 377564b9527SAdrian Hunter 'comm_id,' 378564b9527SAdrian Hunter '(SELECT comm FROM comms WHERE id = comm_id) AS command,' 379564b9527SAdrian Hunter 'thread_id,' 380564b9527SAdrian Hunter '(SELECT pid FROM threads WHERE id = thread_id) AS pid,' 381564b9527SAdrian Hunter '(SELECT tid FROM threads WHERE id = thread_id) AS tid' 382564b9527SAdrian Hunter ' FROM comm_threads') 383564b9527SAdrian Hunter 384564b9527SAdrian Hunterif perf_db_export_calls or perf_db_export_callchains: 385564b9527SAdrian Hunter do_query(query, 'CREATE VIEW call_paths_view AS ' 386564b9527SAdrian Hunter 'SELECT ' 387564b9527SAdrian Hunter 'c.id,' 388564b9527SAdrian Hunter + emit_to_hex('c.ip') + ' AS ip,' 389564b9527SAdrian Hunter 'c.symbol_id,' 390564b9527SAdrian Hunter '(SELECT name FROM symbols WHERE id = c.symbol_id) AS symbol,' 391564b9527SAdrian Hunter '(SELECT dso_id FROM symbols WHERE id = c.symbol_id) AS dso_id,' 392564b9527SAdrian Hunter '(SELECT dso FROM symbols_view WHERE id = c.symbol_id) AS dso_short_name,' 393564b9527SAdrian Hunter 'c.parent_id,' 394564b9527SAdrian Hunter + emit_to_hex('p.ip') + ' AS parent_ip,' 395564b9527SAdrian Hunter 'p.symbol_id AS parent_symbol_id,' 396564b9527SAdrian Hunter '(SELECT name FROM symbols WHERE id = p.symbol_id) AS parent_symbol,' 397564b9527SAdrian Hunter '(SELECT dso_id FROM symbols WHERE id = p.symbol_id) AS parent_dso_id,' 398564b9527SAdrian Hunter '(SELECT dso FROM symbols_view WHERE id = p.symbol_id) AS parent_dso_short_name' 399564b9527SAdrian Hunter ' FROM call_paths c INNER JOIN call_paths p ON p.id = c.parent_id') 400564b9527SAdrian Hunterif perf_db_export_calls: 401564b9527SAdrian Hunter do_query(query, 'CREATE VIEW calls_view AS ' 402564b9527SAdrian Hunter 'SELECT ' 403564b9527SAdrian Hunter 'calls.id,' 404564b9527SAdrian Hunter 'thread_id,' 405564b9527SAdrian Hunter '(SELECT pid FROM threads WHERE id = thread_id) AS pid,' 406564b9527SAdrian Hunter '(SELECT tid FROM threads WHERE id = thread_id) AS tid,' 407564b9527SAdrian Hunter '(SELECT comm FROM comms WHERE id = comm_id) AS command,' 408564b9527SAdrian Hunter 'call_path_id,' 409564b9527SAdrian Hunter + emit_to_hex('ip') + ' AS ip,' 410564b9527SAdrian Hunter 'symbol_id,' 411564b9527SAdrian Hunter '(SELECT name FROM symbols WHERE id = symbol_id) AS symbol,' 412564b9527SAdrian Hunter 'call_time,' 413564b9527SAdrian Hunter 'return_time,' 414564b9527SAdrian Hunter 'return_time - call_time AS elapsed_time,' 415564b9527SAdrian Hunter 'branch_count,' 41664adadb3SAdrian Hunter 'insn_count,' 41764adadb3SAdrian Hunter 'cyc_count,' 41864adadb3SAdrian Hunter 'CASE WHEN cyc_count=0 THEN CAST(0 AS FLOAT) ELSE ROUND(CAST(insn_count AS FLOAT) / cyc_count, 2) END AS IPC,' 419564b9527SAdrian Hunter 'call_id,' 420564b9527SAdrian Hunter 'return_id,' 421f08046cbSAdrian Hunter 'CASE WHEN flags=0 THEN \'\' WHEN flags=1 THEN \'no call\' WHEN flags=2 THEN \'no return\' WHEN flags=3 THEN \'no call/return\' WHEN flags=6 THEN \'jump\' ELSE flags END AS flags,' 4228ce9a725SAdrian Hunter 'parent_call_path_id,' 4236e4b1cacSAdrian Hunter 'calls.parent_id' 424564b9527SAdrian Hunter ' FROM calls INNER JOIN call_paths ON call_paths.id = call_path_id') 425564b9527SAdrian Hunter 426564b9527SAdrian Hunterdo_query(query, 'CREATE VIEW samples_view AS ' 427564b9527SAdrian Hunter 'SELECT ' 428564b9527SAdrian Hunter 'id,' 429564b9527SAdrian Hunter 'time,' 430564b9527SAdrian Hunter 'cpu,' 431564b9527SAdrian Hunter '(SELECT pid FROM threads WHERE id = thread_id) AS pid,' 432564b9527SAdrian Hunter '(SELECT tid FROM threads WHERE id = thread_id) AS tid,' 433564b9527SAdrian Hunter '(SELECT comm FROM comms WHERE id = comm_id) AS command,' 434564b9527SAdrian Hunter '(SELECT name FROM selected_events WHERE id = evsel_id) AS event,' 435564b9527SAdrian Hunter + emit_to_hex('ip') + ' AS ip_hex,' 436564b9527SAdrian Hunter '(SELECT name FROM symbols WHERE id = symbol_id) AS symbol,' 437564b9527SAdrian Hunter 'sym_offset,' 438564b9527SAdrian Hunter '(SELECT short_name FROM dsos WHERE id = dso_id) AS dso_short_name,' 439564b9527SAdrian Hunter + emit_to_hex('to_ip') + ' AS to_ip_hex,' 440564b9527SAdrian Hunter '(SELECT name FROM symbols WHERE id = to_symbol_id) AS to_symbol,' 441564b9527SAdrian Hunter 'to_sym_offset,' 442564b9527SAdrian Hunter '(SELECT short_name FROM dsos WHERE id = to_dso_id) AS to_dso_short_name,' 443564b9527SAdrian Hunter '(SELECT name FROM branch_types WHERE id = branch_type) AS branch_type_name,' 44464adadb3SAdrian Hunter 'in_tx,' 44564adadb3SAdrian Hunter 'insn_count,' 44664adadb3SAdrian Hunter 'cyc_count,' 447*761836cbSAdrian Hunter 'CASE WHEN cyc_count=0 THEN CAST(0 AS FLOAT) ELSE ROUND(CAST(insn_count AS FLOAT) / cyc_count, 2) END AS IPC,' 448*761836cbSAdrian Hunter 'flags' 449564b9527SAdrian Hunter ' FROM samples') 450564b9527SAdrian Hunter 4515130c6e5SAdrian Hunterdo_query(query, 'CREATE VIEW ptwrite_view AS ' 4525130c6e5SAdrian Hunter 'SELECT ' 4535130c6e5SAdrian Hunter 'ptwrite.id,' 4545130c6e5SAdrian Hunter 'time,' 4555130c6e5SAdrian Hunter 'cpu,' 4565130c6e5SAdrian Hunter + emit_to_hex('payload') + ' AS payload_hex,' 4575130c6e5SAdrian Hunter 'CASE WHEN exact_ip=0 THEN \'False\' ELSE \'True\' END AS exact_ip' 4585130c6e5SAdrian Hunter ' FROM ptwrite' 4595130c6e5SAdrian Hunter ' INNER JOIN samples ON samples.id = ptwrite.id') 4605130c6e5SAdrian Hunter 4615130c6e5SAdrian Hunterdo_query(query, 'CREATE VIEW cbr_view AS ' 4625130c6e5SAdrian Hunter 'SELECT ' 4635130c6e5SAdrian Hunter 'cbr.id,' 4645130c6e5SAdrian Hunter 'time,' 4655130c6e5SAdrian Hunter 'cpu,' 4665130c6e5SAdrian Hunter 'cbr,' 4675130c6e5SAdrian Hunter 'mhz,' 4685130c6e5SAdrian Hunter 'percent' 4695130c6e5SAdrian Hunter ' FROM cbr' 4705130c6e5SAdrian Hunter ' INNER JOIN samples ON samples.id = cbr.id') 4715130c6e5SAdrian Hunter 4725130c6e5SAdrian Hunterdo_query(query, 'CREATE VIEW mwait_view AS ' 4735130c6e5SAdrian Hunter 'SELECT ' 4745130c6e5SAdrian Hunter 'mwait.id,' 4755130c6e5SAdrian Hunter 'time,' 4765130c6e5SAdrian Hunter 'cpu,' 4775130c6e5SAdrian Hunter + emit_to_hex('hints') + ' AS hints_hex,' 4785130c6e5SAdrian Hunter + emit_to_hex('extensions') + ' AS extensions_hex' 4795130c6e5SAdrian Hunter ' FROM mwait' 4805130c6e5SAdrian Hunter ' INNER JOIN samples ON samples.id = mwait.id') 4815130c6e5SAdrian Hunter 4825130c6e5SAdrian Hunterdo_query(query, 'CREATE VIEW pwre_view AS ' 4835130c6e5SAdrian Hunter 'SELECT ' 4845130c6e5SAdrian Hunter 'pwre.id,' 4855130c6e5SAdrian Hunter 'time,' 4865130c6e5SAdrian Hunter 'cpu,' 4875130c6e5SAdrian Hunter 'cstate,' 4885130c6e5SAdrian Hunter 'subcstate,' 4895130c6e5SAdrian Hunter 'CASE WHEN hw=0 THEN \'False\' ELSE \'True\' END AS hw' 4905130c6e5SAdrian Hunter ' FROM pwre' 4915130c6e5SAdrian Hunter ' INNER JOIN samples ON samples.id = pwre.id') 4925130c6e5SAdrian Hunter 4935130c6e5SAdrian Hunterdo_query(query, 'CREATE VIEW exstop_view AS ' 4945130c6e5SAdrian Hunter 'SELECT ' 4955130c6e5SAdrian Hunter 'exstop.id,' 4965130c6e5SAdrian Hunter 'time,' 4975130c6e5SAdrian Hunter 'cpu,' 4985130c6e5SAdrian Hunter 'CASE WHEN exact_ip=0 THEN \'False\' ELSE \'True\' END AS exact_ip' 4995130c6e5SAdrian Hunter ' FROM exstop' 5005130c6e5SAdrian Hunter ' INNER JOIN samples ON samples.id = exstop.id') 5015130c6e5SAdrian Hunter 5025130c6e5SAdrian Hunterdo_query(query, 'CREATE VIEW pwrx_view AS ' 5035130c6e5SAdrian Hunter 'SELECT ' 5045130c6e5SAdrian Hunter 'pwrx.id,' 5055130c6e5SAdrian Hunter 'time,' 5065130c6e5SAdrian Hunter 'cpu,' 5075130c6e5SAdrian Hunter 'deepest_cstate,' 5085130c6e5SAdrian Hunter 'last_cstate,' 5095130c6e5SAdrian Hunter 'CASE WHEN wake_reason=1 THEN \'Interrupt\'' 5105130c6e5SAdrian Hunter ' WHEN wake_reason=2 THEN \'Timer Deadline\'' 5115130c6e5SAdrian Hunter ' WHEN wake_reason=4 THEN \'Monitored Address\'' 5125130c6e5SAdrian Hunter ' WHEN wake_reason=8 THEN \'HW\'' 5135130c6e5SAdrian Hunter ' ELSE wake_reason ' 5145130c6e5SAdrian Hunter 'END AS wake_reason' 5155130c6e5SAdrian Hunter ' FROM pwrx' 5165130c6e5SAdrian Hunter ' INNER JOIN samples ON samples.id = pwrx.id') 5175130c6e5SAdrian Hunter 5185130c6e5SAdrian Hunterdo_query(query, 'CREATE VIEW power_events_view AS ' 5195130c6e5SAdrian Hunter 'SELECT ' 5205130c6e5SAdrian Hunter 'samples.id,' 5215130c6e5SAdrian Hunter 'time,' 5225130c6e5SAdrian Hunter 'cpu,' 5235130c6e5SAdrian Hunter 'selected_events.name AS event,' 5245130c6e5SAdrian Hunter 'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT cbr FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS cbr,' 5255130c6e5SAdrian Hunter 'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT mhz FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS mhz,' 5265130c6e5SAdrian Hunter 'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT percent FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS percent,' 5275130c6e5SAdrian Hunter 'CASE WHEN selected_events.name=\'mwait\' THEN (SELECT ' + emit_to_hex('hints') + ' FROM mwait WHERE mwait.id = samples.id) ELSE "" END AS hints_hex,' 5285130c6e5SAdrian Hunter 'CASE WHEN selected_events.name=\'mwait\' THEN (SELECT ' + emit_to_hex('extensions') + ' FROM mwait WHERE mwait.id = samples.id) ELSE "" END AS extensions_hex,' 5295130c6e5SAdrian Hunter 'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT cstate FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS cstate,' 5305130c6e5SAdrian Hunter 'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT subcstate FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS subcstate,' 5315130c6e5SAdrian Hunter 'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT hw FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS hw,' 5325130c6e5SAdrian Hunter 'CASE WHEN selected_events.name=\'exstop\' THEN (SELECT exact_ip FROM exstop WHERE exstop.id = samples.id) ELSE "" END AS exact_ip,' 5335130c6e5SAdrian Hunter 'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT deepest_cstate FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS deepest_cstate,' 5345130c6e5SAdrian Hunter 'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT last_cstate FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS last_cstate,' 5355130c6e5SAdrian Hunter 'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT ' 5365130c6e5SAdrian Hunter 'CASE WHEN wake_reason=1 THEN \'Interrupt\'' 5375130c6e5SAdrian Hunter ' WHEN wake_reason=2 THEN \'Timer Deadline\'' 5385130c6e5SAdrian Hunter ' WHEN wake_reason=4 THEN \'Monitored Address\'' 5395130c6e5SAdrian Hunter ' WHEN wake_reason=8 THEN \'HW\'' 5405130c6e5SAdrian Hunter ' ELSE wake_reason ' 5415130c6e5SAdrian Hunter 'END' 5425130c6e5SAdrian Hunter ' FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS wake_reason' 5435130c6e5SAdrian Hunter ' FROM samples' 5445130c6e5SAdrian Hunter ' INNER JOIN selected_events ON selected_events.id = evsel_id' 5455130c6e5SAdrian Hunter ' WHERE selected_events.name IN (\'cbr\',\'mwait\',\'exstop\',\'pwre\',\'pwrx\')') 5465130c6e5SAdrian Hunter 54737c1f991SAdrian Hunterdo_query(query, 'CREATE VIEW context_switches_view AS ' 54837c1f991SAdrian Hunter 'SELECT ' 54937c1f991SAdrian Hunter 'context_switches.id,' 55037c1f991SAdrian Hunter 'context_switches.machine_id,' 55137c1f991SAdrian Hunter 'context_switches.time,' 55237c1f991SAdrian Hunter 'context_switches.cpu,' 55337c1f991SAdrian Hunter 'th_out.pid AS pid_out,' 55437c1f991SAdrian Hunter 'th_out.tid AS tid_out,' 55537c1f991SAdrian Hunter 'comm_out.comm AS comm_out,' 55637c1f991SAdrian Hunter 'th_in.pid AS pid_in,' 55737c1f991SAdrian Hunter 'th_in.tid AS tid_in,' 55837c1f991SAdrian Hunter 'comm_in.comm AS comm_in,' 55937c1f991SAdrian Hunter 'CASE WHEN context_switches.flags = 0 THEN \'in\'' 56037c1f991SAdrian Hunter ' WHEN context_switches.flags = 1 THEN \'out\'' 56137c1f991SAdrian Hunter ' WHEN context_switches.flags = 3 THEN \'out preempt\'' 56237c1f991SAdrian Hunter ' ELSE context_switches.flags ' 56337c1f991SAdrian Hunter 'END AS flags' 56437c1f991SAdrian Hunter ' FROM context_switches' 56537c1f991SAdrian Hunter ' INNER JOIN threads AS th_out ON th_out.id = context_switches.thread_out_id' 56637c1f991SAdrian Hunter ' INNER JOIN threads AS th_in ON th_in.id = context_switches.thread_in_id' 56737c1f991SAdrian Hunter ' INNER JOIN comms AS comm_out ON comm_out.id = context_switches.comm_out_id' 56837c1f991SAdrian Hunter ' INNER JOIN comms AS comm_in ON comm_in.id = context_switches.comm_in_id') 56937c1f991SAdrian Hunter 570564b9527SAdrian Hunterdo_query(query, 'END TRANSACTION') 571564b9527SAdrian Hunter 572564b9527SAdrian Hunterevsel_query = QSqlQuery(db) 573564b9527SAdrian Hunterevsel_query.prepare("INSERT INTO selected_events VALUES (?, ?)") 574564b9527SAdrian Huntermachine_query = QSqlQuery(db) 575564b9527SAdrian Huntermachine_query.prepare("INSERT INTO machines VALUES (?, ?, ?)") 576564b9527SAdrian Hunterthread_query = QSqlQuery(db) 577564b9527SAdrian Hunterthread_query.prepare("INSERT INTO threads VALUES (?, ?, ?, ?, ?)") 578564b9527SAdrian Huntercomm_query = QSqlQuery(db) 57941085f2bSAdrian Huntercomm_query.prepare("INSERT INTO comms VALUES (?, ?, ?, ?, ?)") 580564b9527SAdrian Huntercomm_thread_query = QSqlQuery(db) 581564b9527SAdrian Huntercomm_thread_query.prepare("INSERT INTO comm_threads VALUES (?, ?, ?)") 582564b9527SAdrian Hunterdso_query = QSqlQuery(db) 583564b9527SAdrian Hunterdso_query.prepare("INSERT INTO dsos VALUES (?, ?, ?, ?, ?)") 584564b9527SAdrian Huntersymbol_query = QSqlQuery(db) 585564b9527SAdrian Huntersymbol_query.prepare("INSERT INTO symbols VALUES (?, ?, ?, ?, ?, ?)") 586564b9527SAdrian Hunterbranch_type_query = QSqlQuery(db) 587564b9527SAdrian Hunterbranch_type_query.prepare("INSERT INTO branch_types VALUES (?, ?)") 588564b9527SAdrian Huntersample_query = QSqlQuery(db) 589564b9527SAdrian Hunterif branches: 590*761836cbSAdrian Hunter sample_query.prepare("INSERT INTO samples VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") 591564b9527SAdrian Hunterelse: 592*761836cbSAdrian Hunter sample_query.prepare("INSERT INTO samples VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") 593564b9527SAdrian Hunterif perf_db_export_calls or perf_db_export_callchains: 594564b9527SAdrian Hunter call_path_query = QSqlQuery(db) 595564b9527SAdrian Hunter call_path_query.prepare("INSERT INTO call_paths VALUES (?, ?, ?, ?)") 596564b9527SAdrian Hunterif perf_db_export_calls: 597564b9527SAdrian Hunter call_query = QSqlQuery(db) 59864adadb3SAdrian Hunter call_query.prepare("INSERT INTO calls VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") 5995130c6e5SAdrian Hunterptwrite_query = QSqlQuery(db) 6005130c6e5SAdrian Hunterptwrite_query.prepare("INSERT INTO ptwrite VALUES (?, ?, ?)") 6015130c6e5SAdrian Huntercbr_query = QSqlQuery(db) 6025130c6e5SAdrian Huntercbr_query.prepare("INSERT INTO cbr VALUES (?, ?, ?, ?)") 6035130c6e5SAdrian Huntermwait_query = QSqlQuery(db) 6045130c6e5SAdrian Huntermwait_query.prepare("INSERT INTO mwait VALUES (?, ?, ?)") 6055130c6e5SAdrian Hunterpwre_query = QSqlQuery(db) 6065130c6e5SAdrian Hunterpwre_query.prepare("INSERT INTO pwre VALUES (?, ?, ?, ?)") 6075130c6e5SAdrian Hunterexstop_query = QSqlQuery(db) 6085130c6e5SAdrian Hunterexstop_query.prepare("INSERT INTO exstop VALUES (?, ?)") 6095130c6e5SAdrian Hunterpwrx_query = QSqlQuery(db) 6105130c6e5SAdrian Hunterpwrx_query.prepare("INSERT INTO pwrx VALUES (?, ?, ?, ?)") 61137c1f991SAdrian Huntercontext_switch_query = QSqlQuery(db) 61237c1f991SAdrian Huntercontext_switch_query.prepare("INSERT INTO context_switches VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)") 613564b9527SAdrian Hunter 614564b9527SAdrian Hunterdef trace_begin(): 61549f93bbfSTony Jones printdate("Writing records...") 616564b9527SAdrian Hunter do_query(query, 'BEGIN TRANSACTION') 617564b9527SAdrian Hunter # id == 0 means unknown. It is easier to create records for them than replace the zeroes with NULLs 618564b9527SAdrian Hunter evsel_table(0, "unknown") 619564b9527SAdrian Hunter machine_table(0, 0, "unknown") 620564b9527SAdrian Hunter thread_table(0, 0, 0, -1, -1) 62141085f2bSAdrian Hunter comm_table(0, "unknown", 0, 0, 0) 622564b9527SAdrian Hunter dso_table(0, 0, "unknown", "unknown", "") 623564b9527SAdrian Hunter symbol_table(0, 0, 0, 0, 0, "unknown") 624*761836cbSAdrian Hunter sample_table(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 625564b9527SAdrian Hunter if perf_db_export_calls or perf_db_export_callchains: 626564b9527SAdrian Hunter call_path_table(0, 0, 0, 0) 62764adadb3SAdrian Hunter call_return_table(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 628564b9527SAdrian Hunter 629564b9527SAdrian Hunterunhandled_count = 0 630564b9527SAdrian Hunter 6315130c6e5SAdrian Hunterdef is_table_empty(table_name): 6325130c6e5SAdrian Hunter do_query(query, 'SELECT * FROM ' + table_name + ' LIMIT 1'); 6335130c6e5SAdrian Hunter if query.next(): 6345130c6e5SAdrian Hunter return False 6355130c6e5SAdrian Hunter return True 6365130c6e5SAdrian Hunter 6375130c6e5SAdrian Hunterdef drop(table_name): 6385130c6e5SAdrian Hunter do_query(query, 'DROP VIEW ' + table_name + '_view'); 6395130c6e5SAdrian Hunter do_query(query, 'DROP TABLE ' + table_name); 6405130c6e5SAdrian Hunter 641564b9527SAdrian Hunterdef trace_end(): 642564b9527SAdrian Hunter do_query(query, 'END TRANSACTION') 643564b9527SAdrian Hunter 64449f93bbfSTony Jones printdate("Adding indexes") 645564b9527SAdrian Hunter if perf_db_export_calls: 646564b9527SAdrian Hunter do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)') 6478ce9a725SAdrian Hunter do_query(query, 'CREATE INDEX pid_idx ON calls (parent_id)') 648ecc8c998SAdrian Hunter do_query(query, 'ALTER TABLE comms ADD has_calls boolean') 649ecc8c998SAdrian Hunter do_query(query, 'UPDATE comms SET has_calls = 1 WHERE comms.id IN (SELECT DISTINCT comm_id FROM calls)') 650564b9527SAdrian Hunter 6515130c6e5SAdrian Hunter printdate("Dropping unused tables") 6525130c6e5SAdrian Hunter if is_table_empty("ptwrite"): 6535130c6e5SAdrian Hunter drop("ptwrite") 6545130c6e5SAdrian Hunter if is_table_empty("mwait") and is_table_empty("pwre") and is_table_empty("exstop") and is_table_empty("pwrx"): 6551334bb94SAdrian Hunter do_query(query, 'DROP VIEW power_events_view'); 6565130c6e5SAdrian Hunter drop("mwait") 6575130c6e5SAdrian Hunter drop("pwre") 6585130c6e5SAdrian Hunter drop("exstop") 6595130c6e5SAdrian Hunter drop("pwrx") 6605130c6e5SAdrian Hunter if is_table_empty("cbr"): 6615130c6e5SAdrian Hunter drop("cbr") 66237c1f991SAdrian Hunter if is_table_empty("context_switches"): 66337c1f991SAdrian Hunter drop("context_switches") 6645130c6e5SAdrian Hunter 665564b9527SAdrian Hunter if (unhandled_count): 66649f93bbfSTony Jones printdate("Warning: ", unhandled_count, " unhandled events") 66749f93bbfSTony Jones printdate("Done") 668564b9527SAdrian Hunter 669564b9527SAdrian Hunterdef trace_unhandled(event_name, context, event_fields_dict): 670564b9527SAdrian Hunter global unhandled_count 671564b9527SAdrian Hunter unhandled_count += 1 672564b9527SAdrian Hunter 673564b9527SAdrian Hunterdef sched__sched_switch(*x): 674564b9527SAdrian Hunter pass 675564b9527SAdrian Hunter 676564b9527SAdrian Hunterdef bind_exec(q, n, x): 677564b9527SAdrian Hunter for xx in x[0:n]: 678564b9527SAdrian Hunter q.addBindValue(str(xx)) 679564b9527SAdrian Hunter do_query_(q) 680564b9527SAdrian Hunter 681564b9527SAdrian Hunterdef evsel_table(*x): 682564b9527SAdrian Hunter bind_exec(evsel_query, 2, x) 683564b9527SAdrian Hunter 684564b9527SAdrian Hunterdef machine_table(*x): 685564b9527SAdrian Hunter bind_exec(machine_query, 3, x) 686564b9527SAdrian Hunter 687564b9527SAdrian Hunterdef thread_table(*x): 688564b9527SAdrian Hunter bind_exec(thread_query, 5, x) 689564b9527SAdrian Hunter 690564b9527SAdrian Hunterdef comm_table(*x): 69141085f2bSAdrian Hunter bind_exec(comm_query, 5, x) 692564b9527SAdrian Hunter 693564b9527SAdrian Hunterdef comm_thread_table(*x): 694564b9527SAdrian Hunter bind_exec(comm_thread_query, 3, x) 695564b9527SAdrian Hunter 696564b9527SAdrian Hunterdef dso_table(*x): 697564b9527SAdrian Hunter bind_exec(dso_query, 5, x) 698564b9527SAdrian Hunter 699564b9527SAdrian Hunterdef symbol_table(*x): 700564b9527SAdrian Hunter bind_exec(symbol_query, 6, x) 701564b9527SAdrian Hunter 702564b9527SAdrian Hunterdef branch_type_table(*x): 703564b9527SAdrian Hunter bind_exec(branch_type_query, 2, x) 704564b9527SAdrian Hunter 705564b9527SAdrian Hunterdef sample_table(*x): 706564b9527SAdrian Hunter if branches: 707d005efe1SAdrian Hunter for xx in x[0:15]: 708d005efe1SAdrian Hunter sample_query.addBindValue(str(xx)) 709*761836cbSAdrian Hunter for xx in x[19:25]: 710d005efe1SAdrian Hunter sample_query.addBindValue(str(xx)) 711d005efe1SAdrian Hunter do_query_(sample_query) 712564b9527SAdrian Hunter else: 713*761836cbSAdrian Hunter bind_exec(sample_query, 25, x) 714564b9527SAdrian Hunter 715564b9527SAdrian Hunterdef call_path_table(*x): 716564b9527SAdrian Hunter bind_exec(call_path_query, 4, x) 717564b9527SAdrian Hunter 718564b9527SAdrian Hunterdef call_return_table(*x): 71964adadb3SAdrian Hunter bind_exec(call_query, 14, x) 7205130c6e5SAdrian Hunter 7215130c6e5SAdrian Hunterdef ptwrite(id, raw_buf): 7225130c6e5SAdrian Hunter data = struct.unpack_from("<IQ", raw_buf) 7235130c6e5SAdrian Hunter flags = data[0] 7245130c6e5SAdrian Hunter payload = data[1] 7255130c6e5SAdrian Hunter exact_ip = flags & 1 7265130c6e5SAdrian Hunter ptwrite_query.addBindValue(str(id)) 7275130c6e5SAdrian Hunter ptwrite_query.addBindValue(str(payload)) 7285130c6e5SAdrian Hunter ptwrite_query.addBindValue(str(exact_ip)) 7295130c6e5SAdrian Hunter do_query_(ptwrite_query) 7305130c6e5SAdrian Hunter 7315130c6e5SAdrian Hunterdef cbr(id, raw_buf): 7325130c6e5SAdrian Hunter data = struct.unpack_from("<BBBBII", raw_buf) 7335130c6e5SAdrian Hunter cbr = data[0] 7345130c6e5SAdrian Hunter MHz = (data[4] + 500) / 1000 7355130c6e5SAdrian Hunter percent = ((cbr * 1000 / data[2]) + 5) / 10 7365130c6e5SAdrian Hunter cbr_query.addBindValue(str(id)) 7375130c6e5SAdrian Hunter cbr_query.addBindValue(str(cbr)) 7385130c6e5SAdrian Hunter cbr_query.addBindValue(str(MHz)) 7395130c6e5SAdrian Hunter cbr_query.addBindValue(str(percent)) 7405130c6e5SAdrian Hunter do_query_(cbr_query) 7415130c6e5SAdrian Hunter 7425130c6e5SAdrian Hunterdef mwait(id, raw_buf): 7435130c6e5SAdrian Hunter data = struct.unpack_from("<IQ", raw_buf) 7445130c6e5SAdrian Hunter payload = data[1] 7455130c6e5SAdrian Hunter hints = payload & 0xff 7465130c6e5SAdrian Hunter extensions = (payload >> 32) & 0x3 7475130c6e5SAdrian Hunter mwait_query.addBindValue(str(id)) 7485130c6e5SAdrian Hunter mwait_query.addBindValue(str(hints)) 7495130c6e5SAdrian Hunter mwait_query.addBindValue(str(extensions)) 7505130c6e5SAdrian Hunter do_query_(mwait_query) 7515130c6e5SAdrian Hunter 7525130c6e5SAdrian Hunterdef pwre(id, raw_buf): 7535130c6e5SAdrian Hunter data = struct.unpack_from("<IQ", raw_buf) 7545130c6e5SAdrian Hunter payload = data[1] 7555130c6e5SAdrian Hunter hw = (payload >> 7) & 1 7565130c6e5SAdrian Hunter cstate = (payload >> 12) & 0xf 7575130c6e5SAdrian Hunter subcstate = (payload >> 8) & 0xf 7585130c6e5SAdrian Hunter pwre_query.addBindValue(str(id)) 7595130c6e5SAdrian Hunter pwre_query.addBindValue(str(cstate)) 7605130c6e5SAdrian Hunter pwre_query.addBindValue(str(subcstate)) 7615130c6e5SAdrian Hunter pwre_query.addBindValue(str(hw)) 7625130c6e5SAdrian Hunter do_query_(pwre_query) 7635130c6e5SAdrian Hunter 7645130c6e5SAdrian Hunterdef exstop(id, raw_buf): 7655130c6e5SAdrian Hunter data = struct.unpack_from("<I", raw_buf) 7665130c6e5SAdrian Hunter flags = data[0] 7675130c6e5SAdrian Hunter exact_ip = flags & 1 7685130c6e5SAdrian Hunter exstop_query.addBindValue(str(id)) 7695130c6e5SAdrian Hunter exstop_query.addBindValue(str(exact_ip)) 7705130c6e5SAdrian Hunter do_query_(exstop_query) 7715130c6e5SAdrian Hunter 7725130c6e5SAdrian Hunterdef pwrx(id, raw_buf): 7735130c6e5SAdrian Hunter data = struct.unpack_from("<IQ", raw_buf) 7745130c6e5SAdrian Hunter payload = data[1] 7755130c6e5SAdrian Hunter deepest_cstate = payload & 0xf 7765130c6e5SAdrian Hunter last_cstate = (payload >> 4) & 0xf 7775130c6e5SAdrian Hunter wake_reason = (payload >> 8) & 0xf 7785130c6e5SAdrian Hunter pwrx_query.addBindValue(str(id)) 7795130c6e5SAdrian Hunter pwrx_query.addBindValue(str(deepest_cstate)) 7805130c6e5SAdrian Hunter pwrx_query.addBindValue(str(last_cstate)) 7815130c6e5SAdrian Hunter pwrx_query.addBindValue(str(wake_reason)) 7825130c6e5SAdrian Hunter do_query_(pwrx_query) 7835130c6e5SAdrian Hunter 7845130c6e5SAdrian Hunterdef synth_data(id, config, raw_buf, *x): 7855130c6e5SAdrian Hunter if config == 0: 7865130c6e5SAdrian Hunter ptwrite(id, raw_buf) 7875130c6e5SAdrian Hunter elif config == 1: 7885130c6e5SAdrian Hunter mwait(id, raw_buf) 7895130c6e5SAdrian Hunter elif config == 2: 7905130c6e5SAdrian Hunter pwre(id, raw_buf) 7915130c6e5SAdrian Hunter elif config == 3: 7925130c6e5SAdrian Hunter exstop(id, raw_buf) 7935130c6e5SAdrian Hunter elif config == 4: 7945130c6e5SAdrian Hunter pwrx(id, raw_buf) 7955130c6e5SAdrian Hunter elif config == 5: 7965130c6e5SAdrian Hunter cbr(id, raw_buf) 79737c1f991SAdrian Hunter 79837c1f991SAdrian Hunterdef context_switch_table(*x): 79937c1f991SAdrian Hunter bind_exec(context_switch_query, 9, x) 800