aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/scripts/python/export-to-sqlite.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/scripts/python/export-to-sqlite.py')
-rw-r--r--tools/perf/scripts/python/export-to-sqlite.py239
1 files changed, 239 insertions, 0 deletions
diff --git a/tools/perf/scripts/python/export-to-sqlite.py b/tools/perf/scripts/python/export-to-sqlite.py
index 4542ce89034b..3222a83f4184 100644
--- a/tools/perf/scripts/python/export-to-sqlite.py
+++ b/tools/perf/scripts/python/export-to-sqlite.py
@@ -271,6 +271,38 @@ if perf_db_export_calls:
271 'insn_count bigint,' 271 'insn_count bigint,'
272 'cyc_count bigint)') 272 'cyc_count bigint)')
273 273
274do_query(query, 'CREATE TABLE ptwrite ('
275 'id integer NOT NULL PRIMARY KEY,'
276 'payload bigint,'
277 'exact_ip integer)')
278
279do_query(query, 'CREATE TABLE cbr ('
280 'id integer NOT NULL PRIMARY KEY,'
281 'cbr integer,'
282 'mhz integer,'
283 'percent integer)')
284
285do_query(query, 'CREATE TABLE mwait ('
286 'id integer NOT NULL PRIMARY KEY,'
287 'hints integer,'
288 'extensions integer)')
289
290do_query(query, 'CREATE TABLE pwre ('
291 'id integer NOT NULL PRIMARY KEY,'
292 'cstate integer,'
293 'subcstate integer,'
294 'hw integer)')
295
296do_query(query, 'CREATE TABLE exstop ('
297 'id integer NOT NULL PRIMARY KEY,'
298 'exact_ip integer)')
299
300do_query(query, 'CREATE TABLE pwrx ('
301 'id integer NOT NULL PRIMARY KEY,'
302 'deepest_cstate integer,'
303 'last_cstate integer,'
304 'wake_reason integer)')
305
274# printf was added to sqlite in version 3.8.3 306# printf was added to sqlite in version 3.8.3
275sqlite_has_printf = False 307sqlite_has_printf = False
276try: 308try:
@@ -399,6 +431,102 @@ do_query(query, 'CREATE VIEW samples_view AS '
399 'CASE WHEN cyc_count=0 THEN CAST(0 AS FLOAT) ELSE ROUND(CAST(insn_count AS FLOAT) / cyc_count, 2) END AS IPC' 431 'CASE WHEN cyc_count=0 THEN CAST(0 AS FLOAT) ELSE ROUND(CAST(insn_count AS FLOAT) / cyc_count, 2) END AS IPC'
400 ' FROM samples') 432 ' FROM samples')
401 433
434do_query(query, 'CREATE VIEW ptwrite_view AS '
435 'SELECT '
436 'ptwrite.id,'
437 'time,'
438 'cpu,'
439 + emit_to_hex('payload') + ' AS payload_hex,'
440 'CASE WHEN exact_ip=0 THEN \'False\' ELSE \'True\' END AS exact_ip'
441 ' FROM ptwrite'
442 ' INNER JOIN samples ON samples.id = ptwrite.id')
443
444do_query(query, 'CREATE VIEW cbr_view AS '
445 'SELECT '
446 'cbr.id,'
447 'time,'
448 'cpu,'
449 'cbr,'
450 'mhz,'
451 'percent'
452 ' FROM cbr'
453 ' INNER JOIN samples ON samples.id = cbr.id')
454
455do_query(query, 'CREATE VIEW mwait_view AS '
456 'SELECT '
457 'mwait.id,'
458 'time,'
459 'cpu,'
460 + emit_to_hex('hints') + ' AS hints_hex,'
461 + emit_to_hex('extensions') + ' AS extensions_hex'
462 ' FROM mwait'
463 ' INNER JOIN samples ON samples.id = mwait.id')
464
465do_query(query, 'CREATE VIEW pwre_view AS '
466 'SELECT '
467 'pwre.id,'
468 'time,'
469 'cpu,'
470 'cstate,'
471 'subcstate,'
472 'CASE WHEN hw=0 THEN \'False\' ELSE \'True\' END AS hw'
473 ' FROM pwre'
474 ' INNER JOIN samples ON samples.id = pwre.id')
475
476do_query(query, 'CREATE VIEW exstop_view AS '
477 'SELECT '
478 'exstop.id,'
479 'time,'
480 'cpu,'
481 'CASE WHEN exact_ip=0 THEN \'False\' ELSE \'True\' END AS exact_ip'
482 ' FROM exstop'
483 ' INNER JOIN samples ON samples.id = exstop.id')
484
485do_query(query, 'CREATE VIEW pwrx_view AS '
486 'SELECT '
487 'pwrx.id,'
488 'time,'
489 'cpu,'
490 'deepest_cstate,'
491 'last_cstate,'
492 'CASE WHEN wake_reason=1 THEN \'Interrupt\''
493 ' WHEN wake_reason=2 THEN \'Timer Deadline\''
494 ' WHEN wake_reason=4 THEN \'Monitored Address\''
495 ' WHEN wake_reason=8 THEN \'HW\''
496 ' ELSE wake_reason '
497 'END AS wake_reason'
498 ' FROM pwrx'
499 ' INNER JOIN samples ON samples.id = pwrx.id')
500
501do_query(query, 'CREATE VIEW power_events_view AS '
502 'SELECT '
503 'samples.id,'
504 'time,'
505 'cpu,'
506 'selected_events.name AS event,'
507 'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT cbr FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS cbr,'
508 'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT mhz FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS mhz,'
509 'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT percent FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS percent,'
510 'CASE WHEN selected_events.name=\'mwait\' THEN (SELECT ' + emit_to_hex('hints') + ' FROM mwait WHERE mwait.id = samples.id) ELSE "" END AS hints_hex,'
511 'CASE WHEN selected_events.name=\'mwait\' THEN (SELECT ' + emit_to_hex('extensions') + ' FROM mwait WHERE mwait.id = samples.id) ELSE "" END AS extensions_hex,'
512 'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT cstate FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS cstate,'
513 'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT subcstate FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS subcstate,'
514 'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT hw FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS hw,'
515 'CASE WHEN selected_events.name=\'exstop\' THEN (SELECT exact_ip FROM exstop WHERE exstop.id = samples.id) ELSE "" END AS exact_ip,'
516 'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT deepest_cstate FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS deepest_cstate,'
517 'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT last_cstate FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS last_cstate,'
518 'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT '
519 'CASE WHEN wake_reason=1 THEN \'Interrupt\''
520 ' WHEN wake_reason=2 THEN \'Timer Deadline\''
521 ' WHEN wake_reason=4 THEN \'Monitored Address\''
522 ' WHEN wake_reason=8 THEN \'HW\''
523 ' ELSE wake_reason '
524 'END'
525 ' FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS wake_reason'
526 ' FROM samples'
527 ' INNER JOIN selected_events ON selected_events.id = evsel_id'
528 ' WHERE selected_events.name IN (\'cbr\',\'mwait\',\'exstop\',\'pwre\',\'pwrx\')')
529
402do_query(query, 'END TRANSACTION') 530do_query(query, 'END TRANSACTION')
403 531
404evsel_query = QSqlQuery(db) 532evsel_query = QSqlQuery(db)
@@ -428,6 +556,18 @@ if perf_db_export_calls or perf_db_export_callchains:
428if perf_db_export_calls: 556if perf_db_export_calls:
429 call_query = QSqlQuery(db) 557 call_query = QSqlQuery(db)
430 call_query.prepare("INSERT INTO calls VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") 558 call_query.prepare("INSERT INTO calls VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
559ptwrite_query = QSqlQuery(db)
560ptwrite_query.prepare("INSERT INTO ptwrite VALUES (?, ?, ?)")
561cbr_query = QSqlQuery(db)
562cbr_query.prepare("INSERT INTO cbr VALUES (?, ?, ?, ?)")
563mwait_query = QSqlQuery(db)
564mwait_query.prepare("INSERT INTO mwait VALUES (?, ?, ?)")
565pwre_query = QSqlQuery(db)
566pwre_query.prepare("INSERT INTO pwre VALUES (?, ?, ?, ?)")
567exstop_query = QSqlQuery(db)
568exstop_query.prepare("INSERT INTO exstop VALUES (?, ?)")
569pwrx_query = QSqlQuery(db)
570pwrx_query.prepare("INSERT INTO pwrx VALUES (?, ?, ?, ?)")
431 571
432def trace_begin(): 572def trace_begin():
433 printdate("Writing records...") 573 printdate("Writing records...")
@@ -446,6 +586,16 @@ def trace_begin():
446 586
447unhandled_count = 0 587unhandled_count = 0
448 588
589def is_table_empty(table_name):
590 do_query(query, 'SELECT * FROM ' + table_name + ' LIMIT 1');
591 if query.next():
592 return False
593 return True
594
595def drop(table_name):
596 do_query(query, 'DROP VIEW ' + table_name + '_view');
597 do_query(query, 'DROP TABLE ' + table_name);
598
449def trace_end(): 599def trace_end():
450 do_query(query, 'END TRANSACTION') 600 do_query(query, 'END TRANSACTION')
451 601
@@ -454,6 +604,18 @@ def trace_end():
454 do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)') 604 do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)')
455 do_query(query, 'CREATE INDEX pid_idx ON calls (parent_id)') 605 do_query(query, 'CREATE INDEX pid_idx ON calls (parent_id)')
456 606
607 printdate("Dropping unused tables")
608 if is_table_empty("ptwrite"):
609 drop("ptwrite")
610 if is_table_empty("mwait") and is_table_empty("pwre") and is_table_empty("exstop") and is_table_empty("pwrx"):
611 drop("mwait")
612 drop("pwre")
613 drop("exstop")
614 drop("pwrx")
615 do_query(query, 'DROP VIEW power_events_view');
616 if is_table_empty("cbr"):
617 drop("cbr")
618
457 if (unhandled_count): 619 if (unhandled_count):
458 printdate("Warning: ", unhandled_count, " unhandled events") 620 printdate("Warning: ", unhandled_count, " unhandled events")
459 printdate("Done") 621 printdate("Done")
@@ -509,3 +671,80 @@ def call_path_table(*x):
509 671
510def call_return_table(*x): 672def call_return_table(*x):
511 bind_exec(call_query, 14, x) 673 bind_exec(call_query, 14, x)
674
675def ptwrite(id, raw_buf):
676 data = struct.unpack_from("<IQ", raw_buf)
677 flags = data[0]
678 payload = data[1]
679 exact_ip = flags & 1
680 ptwrite_query.addBindValue(str(id))
681 ptwrite_query.addBindValue(str(payload))
682 ptwrite_query.addBindValue(str(exact_ip))
683 do_query_(ptwrite_query)
684
685def cbr(id, raw_buf):
686 data = struct.unpack_from("<BBBBII", raw_buf)
687 cbr = data[0]
688 MHz = (data[4] + 500) / 1000
689 percent = ((cbr * 1000 / data[2]) + 5) / 10
690 cbr_query.addBindValue(str(id))
691 cbr_query.addBindValue(str(cbr))
692 cbr_query.addBindValue(str(MHz))
693 cbr_query.addBindValue(str(percent))
694 do_query_(cbr_query)
695
696def mwait(id, raw_buf):
697 data = struct.unpack_from("<IQ", raw_buf)
698 payload = data[1]
699 hints = payload & 0xff
700 extensions = (payload >> 32) & 0x3
701 mwait_query.addBindValue(str(id))
702 mwait_query.addBindValue(str(hints))
703 mwait_query.addBindValue(str(extensions))
704 do_query_(mwait_query)
705
706def pwre(id, raw_buf):
707 data = struct.unpack_from("<IQ", raw_buf)
708 payload = data[1]
709 hw = (payload >> 7) & 1
710 cstate = (payload >> 12) & 0xf
711 subcstate = (payload >> 8) & 0xf
712 pwre_query.addBindValue(str(id))
713 pwre_query.addBindValue(str(cstate))
714 pwre_query.addBindValue(str(subcstate))
715 pwre_query.addBindValue(str(hw))
716 do_query_(pwre_query)
717
718def exstop(id, raw_buf):
719 data = struct.unpack_from("<I", raw_buf)
720 flags = data[0]
721 exact_ip = flags & 1
722 exstop_query.addBindValue(str(id))
723 exstop_query.addBindValue(str(exact_ip))
724 do_query_(exstop_query)
725
726def pwrx(id, raw_buf):
727 data = struct.unpack_from("<IQ", raw_buf)
728 payload = data[1]
729 deepest_cstate = payload & 0xf
730 last_cstate = (payload >> 4) & 0xf
731 wake_reason = (payload >> 8) & 0xf
732 pwrx_query.addBindValue(str(id))
733 pwrx_query.addBindValue(str(deepest_cstate))
734 pwrx_query.addBindValue(str(last_cstate))
735 pwrx_query.addBindValue(str(wake_reason))
736 do_query_(pwrx_query)
737
738def synth_data(id, config, raw_buf, *x):
739 if config == 0:
740 ptwrite(id, raw_buf)
741 elif config == 1:
742 mwait(id, raw_buf)
743 elif config == 2:
744 pwre(id, raw_buf)
745 elif config == 3:
746 exstop(id, raw_buf)
747 elif config == 4:
748 pwrx(id, raw_buf)
749 elif config == 5:
750 cbr(id, raw_buf)