aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/scripts/python/export-to-postgresql.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/scripts/python/export-to-postgresql.py')
-rw-r--r--tools/perf/scripts/python/export-to-postgresql.py251
1 files changed, 251 insertions, 0 deletions
diff --git a/tools/perf/scripts/python/export-to-postgresql.py b/tools/perf/scripts/python/export-to-postgresql.py
index 93225c02117e..4447f0d7c754 100644
--- a/tools/perf/scripts/python/export-to-postgresql.py
+++ b/tools/perf/scripts/python/export-to-postgresql.py
@@ -447,6 +447,38 @@ if perf_db_export_calls:
447 'insn_count bigint,' 447 'insn_count bigint,'
448 'cyc_count bigint)') 448 'cyc_count bigint)')
449 449
450do_query(query, 'CREATE TABLE ptwrite ('
451 'id bigint NOT NULL,'
452 'payload bigint,'
453 'exact_ip boolean)')
454
455do_query(query, 'CREATE TABLE cbr ('
456 'id bigint NOT NULL,'
457 'cbr integer,'
458 'mhz integer,'
459 'percent integer)')
460
461do_query(query, 'CREATE TABLE mwait ('
462 'id bigint NOT NULL,'
463 'hints integer,'
464 'extensions integer)')
465
466do_query(query, 'CREATE TABLE pwre ('
467 'id bigint NOT NULL,'
468 'cstate integer,'
469 'subcstate integer,'
470 'hw boolean)')
471
472do_query(query, 'CREATE TABLE exstop ('
473 'id bigint NOT NULL,'
474 'exact_ip boolean)')
475
476do_query(query, 'CREATE TABLE pwrx ('
477 'id bigint NOT NULL,'
478 'deepest_cstate integer,'
479 'last_cstate integer,'
480 'wake_reason integer)')
481
450do_query(query, 'CREATE VIEW machines_view AS ' 482do_query(query, 'CREATE VIEW machines_view AS '
451 'SELECT ' 483 'SELECT '
452 'id,' 484 'id,'
@@ -561,6 +593,104 @@ do_query(query, 'CREATE VIEW samples_view AS '
561 'CASE WHEN cyc_count=0 THEN CAST(0 AS NUMERIC(20, 2)) ELSE CAST((CAST(insn_count AS FLOAT) / cyc_count) AS NUMERIC(20, 2)) END AS IPC' 593 'CASE WHEN cyc_count=0 THEN CAST(0 AS NUMERIC(20, 2)) ELSE CAST((CAST(insn_count AS FLOAT) / cyc_count) AS NUMERIC(20, 2)) END AS IPC'
562 ' FROM samples') 594 ' FROM samples')
563 595
596do_query(query, 'CREATE VIEW ptwrite_view AS '
597 'SELECT '
598 'ptwrite.id,'
599 'time,'
600 'cpu,'
601 'to_hex(payload) AS payload_hex,'
602 'CASE WHEN exact_ip=FALSE THEN \'False\' ELSE \'True\' END AS exact_ip'
603 ' FROM ptwrite'
604 ' INNER JOIN samples ON samples.id = ptwrite.id')
605
606do_query(query, 'CREATE VIEW cbr_view AS '
607 'SELECT '
608 'cbr.id,'
609 'time,'
610 'cpu,'
611 'cbr,'
612 'mhz,'
613 'percent'
614 ' FROM cbr'
615 ' INNER JOIN samples ON samples.id = cbr.id')
616
617do_query(query, 'CREATE VIEW mwait_view AS '
618 'SELECT '
619 'mwait.id,'
620 'time,'
621 'cpu,'
622 'to_hex(hints) AS hints_hex,'
623 'to_hex(extensions) AS extensions_hex'
624 ' FROM mwait'
625 ' INNER JOIN samples ON samples.id = mwait.id')
626
627do_query(query, 'CREATE VIEW pwre_view AS '
628 'SELECT '
629 'pwre.id,'
630 'time,'
631 'cpu,'
632 'cstate,'
633 'subcstate,'
634 'CASE WHEN hw=FALSE THEN \'False\' ELSE \'True\' END AS hw'
635 ' FROM pwre'
636 ' INNER JOIN samples ON samples.id = pwre.id')
637
638do_query(query, 'CREATE VIEW exstop_view AS '
639 'SELECT '
640 'exstop.id,'
641 'time,'
642 'cpu,'
643 'CASE WHEN exact_ip=FALSE THEN \'False\' ELSE \'True\' END AS exact_ip'
644 ' FROM exstop'
645 ' INNER JOIN samples ON samples.id = exstop.id')
646
647do_query(query, 'CREATE VIEW pwrx_view AS '
648 'SELECT '
649 'pwrx.id,'
650 'time,'
651 'cpu,'
652 'deepest_cstate,'
653 'last_cstate,'
654 'CASE WHEN wake_reason=1 THEN \'Interrupt\''
655 ' WHEN wake_reason=2 THEN \'Timer Deadline\''
656 ' WHEN wake_reason=4 THEN \'Monitored Address\''
657 ' WHEN wake_reason=8 THEN \'HW\''
658 ' ELSE CAST ( wake_reason AS VARCHAR(2) )'
659 'END AS wake_reason'
660 ' FROM pwrx'
661 ' INNER JOIN samples ON samples.id = pwrx.id')
662
663do_query(query, 'CREATE VIEW power_events_view AS '
664 'SELECT '
665 'samples.id,'
666 'samples.time,'
667 'samples.cpu,'
668 'selected_events.name AS event,'
669 'FORMAT(\'%6s\', cbr.cbr) AS cbr,'
670 'FORMAT(\'%6s\', cbr.mhz) AS MHz,'
671 'FORMAT(\'%5s\', cbr.percent) AS percent,'
672 'to_hex(mwait.hints) AS hints_hex,'
673 'to_hex(mwait.extensions) AS extensions_hex,'
674 'FORMAT(\'%3s\', pwre.cstate) AS cstate,'
675 'FORMAT(\'%3s\', pwre.subcstate) AS subcstate,'
676 'CASE WHEN pwre.hw=FALSE THEN \'False\' WHEN pwre.hw=TRUE THEN \'True\' ELSE NULL END AS hw,'
677 'CASE WHEN exstop.exact_ip=FALSE THEN \'False\' WHEN exstop.exact_ip=TRUE THEN \'True\' ELSE NULL END AS exact_ip,'
678 'FORMAT(\'%3s\', pwrx.deepest_cstate) AS deepest_cstate,'
679 'FORMAT(\'%3s\', pwrx.last_cstate) AS last_cstate,'
680 'CASE WHEN pwrx.wake_reason=1 THEN \'Interrupt\''
681 ' WHEN pwrx.wake_reason=2 THEN \'Timer Deadline\''
682 ' WHEN pwrx.wake_reason=4 THEN \'Monitored Address\''
683 ' WHEN pwrx.wake_reason=8 THEN \'HW\''
684 ' ELSE FORMAT(\'%2s\', pwrx.wake_reason)'
685 'END AS wake_reason'
686 ' FROM cbr'
687 ' FULL JOIN mwait ON mwait.id = cbr.id'
688 ' FULL JOIN pwre ON pwre.id = cbr.id'
689 ' FULL JOIN exstop ON exstop.id = cbr.id'
690 ' FULL JOIN pwrx ON pwrx.id = cbr.id'
691 ' INNER JOIN samples ON samples.id = coalesce(cbr.id, mwait.id, pwre.id, exstop.id, pwrx.id)'
692 ' INNER JOIN selected_events ON selected_events.id = samples.evsel_id'
693 ' ORDER BY samples.id')
564 694
565file_header = struct.pack("!11sii", b"PGCOPY\n\377\r\n\0", 0, 0) 695file_header = struct.pack("!11sii", b"PGCOPY\n\377\r\n\0", 0, 0)
566file_trailer = b"\377\377" 696file_trailer = b"\377\377"
@@ -620,6 +750,12 @@ if perf_db_export_calls or perf_db_export_callchains:
620 call_path_file = open_output_file("call_path_table.bin") 750 call_path_file = open_output_file("call_path_table.bin")
621if perf_db_export_calls: 751if perf_db_export_calls:
622 call_file = open_output_file("call_table.bin") 752 call_file = open_output_file("call_table.bin")
753ptwrite_file = open_output_file("ptwrite_table.bin")
754cbr_file = open_output_file("cbr_table.bin")
755mwait_file = open_output_file("mwait_table.bin")
756pwre_file = open_output_file("pwre_table.bin")
757exstop_file = open_output_file("exstop_table.bin")
758pwrx_file = open_output_file("pwrx_table.bin")
623 759
624def trace_begin(): 760def trace_begin():
625 printdate("Writing to intermediate files...") 761 printdate("Writing to intermediate files...")
@@ -637,6 +773,16 @@ def trace_begin():
637 773
638unhandled_count = 0 774unhandled_count = 0
639 775
776def is_table_empty(table_name):
777 do_query(query, 'SELECT * FROM ' + table_name + ' LIMIT 1');
778 if query.next():
779 return False
780 return True
781
782def drop(table_name):
783 do_query(query, 'DROP VIEW ' + table_name + '_view');
784 do_query(query, 'DROP TABLE ' + table_name);
785
640def trace_end(): 786def trace_end():
641 printdate("Copying to database...") 787 printdate("Copying to database...")
642 copy_output_file(evsel_file, "selected_events") 788 copy_output_file(evsel_file, "selected_events")
@@ -652,6 +798,12 @@ def trace_end():
652 copy_output_file(call_path_file, "call_paths") 798 copy_output_file(call_path_file, "call_paths")
653 if perf_db_export_calls: 799 if perf_db_export_calls:
654 copy_output_file(call_file, "calls") 800 copy_output_file(call_file, "calls")
801 copy_output_file(ptwrite_file, "ptwrite")
802 copy_output_file(cbr_file, "cbr")
803 copy_output_file(mwait_file, "mwait")
804 copy_output_file(pwre_file, "pwre")
805 copy_output_file(exstop_file, "exstop")
806 copy_output_file(pwrx_file, "pwrx")
655 807
656 printdate("Removing intermediate files...") 808 printdate("Removing intermediate files...")
657 remove_output_file(evsel_file) 809 remove_output_file(evsel_file)
@@ -667,6 +819,12 @@ def trace_end():
667 remove_output_file(call_path_file) 819 remove_output_file(call_path_file)
668 if perf_db_export_calls: 820 if perf_db_export_calls:
669 remove_output_file(call_file) 821 remove_output_file(call_file)
822 remove_output_file(ptwrite_file)
823 remove_output_file(cbr_file)
824 remove_output_file(mwait_file)
825 remove_output_file(pwre_file)
826 remove_output_file(exstop_file)
827 remove_output_file(pwrx_file)
670 os.rmdir(output_dir_name) 828 os.rmdir(output_dir_name)
671 printdate("Adding primary keys") 829 printdate("Adding primary keys")
672 do_query(query, 'ALTER TABLE selected_events ADD PRIMARY KEY (id)') 830 do_query(query, 'ALTER TABLE selected_events ADD PRIMARY KEY (id)')
@@ -682,6 +840,12 @@ def trace_end():
682 do_query(query, 'ALTER TABLE call_paths ADD PRIMARY KEY (id)') 840 do_query(query, 'ALTER TABLE call_paths ADD PRIMARY KEY (id)')
683 if perf_db_export_calls: 841 if perf_db_export_calls:
684 do_query(query, 'ALTER TABLE calls ADD PRIMARY KEY (id)') 842 do_query(query, 'ALTER TABLE calls ADD PRIMARY KEY (id)')
843 do_query(query, 'ALTER TABLE ptwrite ADD PRIMARY KEY (id)')
844 do_query(query, 'ALTER TABLE cbr ADD PRIMARY KEY (id)')
845 do_query(query, 'ALTER TABLE mwait ADD PRIMARY KEY (id)')
846 do_query(query, 'ALTER TABLE pwre ADD PRIMARY KEY (id)')
847 do_query(query, 'ALTER TABLE exstop ADD PRIMARY KEY (id)')
848 do_query(query, 'ALTER TABLE pwrx ADD PRIMARY KEY (id)')
685 849
686 printdate("Adding foreign keys") 850 printdate("Adding foreign keys")
687 do_query(query, 'ALTER TABLE threads ' 851 do_query(query, 'ALTER TABLE threads '
@@ -717,6 +881,30 @@ def trace_end():
717 'ADD CONSTRAINT parent_call_pathfk FOREIGN KEY (parent_call_path_id) REFERENCES call_paths (id)') 881 'ADD CONSTRAINT parent_call_pathfk FOREIGN KEY (parent_call_path_id) REFERENCES call_paths (id)')
718 do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)') 882 do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)')
719 do_query(query, 'CREATE INDEX pid_idx ON calls (parent_id)') 883 do_query(query, 'CREATE INDEX pid_idx ON calls (parent_id)')
884 do_query(query, 'ALTER TABLE ptwrite '
885 'ADD CONSTRAINT idfk FOREIGN KEY (id) REFERENCES samples (id)')
886 do_query(query, 'ALTER TABLE cbr '
887 'ADD CONSTRAINT idfk FOREIGN KEY (id) REFERENCES samples (id)')
888 do_query(query, 'ALTER TABLE mwait '
889 'ADD CONSTRAINT idfk FOREIGN KEY (id) REFERENCES samples (id)')
890 do_query(query, 'ALTER TABLE pwre '
891 'ADD CONSTRAINT idfk FOREIGN KEY (id) REFERENCES samples (id)')
892 do_query(query, 'ALTER TABLE exstop '
893 'ADD CONSTRAINT idfk FOREIGN KEY (id) REFERENCES samples (id)')
894 do_query(query, 'ALTER TABLE pwrx '
895 'ADD CONSTRAINT idfk FOREIGN KEY (id) REFERENCES samples (id)')
896
897 printdate("Dropping unused tables")
898 if is_table_empty("ptwrite"):
899 drop("ptwrite")
900 if is_table_empty("mwait") and is_table_empty("pwre") and is_table_empty("exstop") and is_table_empty("pwrx"):
901 drop("mwait")
902 drop("pwre")
903 drop("exstop")
904 drop("pwrx")
905 do_query(query, 'DROP VIEW power_events_view');
906 if is_table_empty("cbr"):
907 drop("cbr")
720 908
721 if (unhandled_count): 909 if (unhandled_count):
722 printdate("Warning: ", unhandled_count, " unhandled events") 910 printdate("Warning: ", unhandled_count, " unhandled events")
@@ -800,3 +988,66 @@ def call_return_table(cr_id, thread_id, comm_id, call_path_id, call_time, return
800 fmt = "!hiqiqiqiqiqiqiqiqiqiqiiiqiqiq" 988 fmt = "!hiqiqiqiqiqiqiqiqiqiqiiiqiqiq"
801 value = struct.pack(fmt, 14, 8, cr_id, 8, thread_id, 8, comm_id, 8, call_path_id, 8, call_time, 8, return_time, 8, branch_count, 8, call_id, 8, return_id, 8, parent_call_path_id, 4, flags, 8, parent_id, 8, insn_cnt, 8, cyc_cnt) 989 value = struct.pack(fmt, 14, 8, cr_id, 8, thread_id, 8, comm_id, 8, call_path_id, 8, call_time, 8, return_time, 8, branch_count, 8, call_id, 8, return_id, 8, parent_call_path_id, 4, flags, 8, parent_id, 8, insn_cnt, 8, cyc_cnt)
802 call_file.write(value) 990 call_file.write(value)
991
992def ptwrite(id, raw_buf):
993 data = struct.unpack_from("<IQ", raw_buf)
994 flags = data[0]
995 payload = data[1]
996 exact_ip = flags & 1
997 value = struct.pack("!hiqiqiB", 3, 8, id, 8, payload, 1, exact_ip)
998 ptwrite_file.write(value)
999
1000def cbr(id, raw_buf):
1001 data = struct.unpack_from("<BBBBII", raw_buf)
1002 cbr = data[0]
1003 MHz = (data[4] + 500) / 1000
1004 percent = ((cbr * 1000 / data[2]) + 5) / 10
1005 value = struct.pack("!hiqiiiiii", 4, 8, id, 4, cbr, 4, MHz, 4, percent)
1006 cbr_file.write(value)
1007
1008def mwait(id, raw_buf):
1009 data = struct.unpack_from("<IQ", raw_buf)
1010 payload = data[1]
1011 hints = payload & 0xff
1012 extensions = (payload >> 32) & 0x3
1013 value = struct.pack("!hiqiiii", 3, 8, id, 4, hints, 4, extensions)
1014 mwait_file.write(value)
1015
1016def pwre(id, raw_buf):
1017 data = struct.unpack_from("<IQ", raw_buf)
1018 payload = data[1]
1019 hw = (payload >> 7) & 1
1020 cstate = (payload >> 12) & 0xf
1021 subcstate = (payload >> 8) & 0xf
1022 value = struct.pack("!hiqiiiiiB", 4, 8, id, 4, cstate, 4, subcstate, 1, hw)
1023 pwre_file.write(value)
1024
1025def exstop(id, raw_buf):
1026 data = struct.unpack_from("<I", raw_buf)
1027 flags = data[0]
1028 exact_ip = flags & 1
1029 value = struct.pack("!hiqiB", 2, 8, id, 1, exact_ip)
1030 exstop_file.write(value)
1031
1032def pwrx(id, raw_buf):
1033 data = struct.unpack_from("<IQ", raw_buf)
1034 payload = data[1]
1035 deepest_cstate = payload & 0xf
1036 last_cstate = (payload >> 4) & 0xf
1037 wake_reason = (payload >> 8) & 0xf
1038 value = struct.pack("!hiqiiiiii", 4, 8, id, 4, deepest_cstate, 4, last_cstate, 4, wake_reason)
1039 pwrx_file.write(value)
1040
1041def synth_data(id, config, raw_buf, *x):
1042 if config == 0:
1043 ptwrite(id, raw_buf)
1044 elif config == 1:
1045 mwait(id, raw_buf)
1046 elif config == 2:
1047 pwre(id, raw_buf)
1048 elif config == 3:
1049 exstop(id, raw_buf)
1050 elif config == 4:
1051 pwrx(id, raw_buf)
1052 elif config == 5:
1053 cbr(id, raw_buf)