perf scripts python: export-to-postgresql.py: Export switch events
authorAdrian Hunter <adrian.hunter@intel.com>
Wed, 10 Jul 2019 08:58:10 +0000 (11:58 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 10 Jul 2019 16:05:12 +0000 (13:05 -0300)
Export switch events to a new table 'context_switches' and create a view
'context_switches_view'. The table and view will show automatically in the
exported-sql-viewer.py script.

If the table ends up empty, then it and the view are dropped.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/20190710085810.1650-22-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/scripts/python/export-to-postgresql.py

index 13205e4..7bd73a9 100644 (file)
@@ -482,6 +482,17 @@ do_query(query, 'CREATE TABLE pwrx ('
        'last_cstate    integer,'
        'wake_reason    integer)')
 
+do_query(query, 'CREATE TABLE context_switches ('
+               'id             bigint          NOT NULL,'
+               'machine_id     bigint,'
+               'time           bigint,'
+               'cpu            integer,'
+               'thread_out_id  bigint,'
+               'comm_out_id    bigint,'
+               'thread_in_id   bigint,'
+               'comm_in_id     bigint,'
+               'flags          integer)')
+
 do_query(query, 'CREATE VIEW machines_view AS '
        'SELECT '
                'id,'
@@ -695,6 +706,29 @@ do_query(query, 'CREATE VIEW power_events_view AS '
        ' INNER JOIN selected_events ON selected_events.id = samples.evsel_id'
        ' ORDER BY samples.id')
 
+do_query(query, 'CREATE VIEW context_switches_view AS '
+       'SELECT '
+               'context_switches.id,'
+               'context_switches.machine_id,'
+               'context_switches.time,'
+               'context_switches.cpu,'
+               'th_out.pid AS pid_out,'
+               'th_out.tid AS tid_out,'
+               'comm_out.comm AS comm_out,'
+               'th_in.pid AS pid_in,'
+               'th_in.tid AS tid_in,'
+               'comm_in.comm AS comm_in,'
+               'CASE     WHEN context_switches.flags = 0 THEN \'in\''
+                       ' WHEN context_switches.flags = 1 THEN \'out\''
+                       ' WHEN context_switches.flags = 3 THEN \'out preempt\''
+                       ' ELSE CAST ( context_switches.flags AS VARCHAR(11) )'
+               'END AS flags'
+       ' FROM context_switches'
+       ' INNER JOIN threads AS th_out ON th_out.id   = context_switches.thread_out_id'
+       ' INNER JOIN threads AS th_in  ON th_in.id    = context_switches.thread_in_id'
+       ' INNER JOIN comms AS comm_out ON comm_out.id = context_switches.comm_out_id'
+       ' INNER JOIN comms AS comm_in  ON comm_in.id  = context_switches.comm_in_id')
+
 file_header = struct.pack("!11sii", b"PGCOPY\n\377\r\n\0", 0, 0)
 file_trailer = b"\377\377"
 
@@ -759,6 +793,7 @@ mwait_file          = open_output_file("mwait_table.bin")
 pwre_file              = open_output_file("pwre_table.bin")
 exstop_file            = open_output_file("exstop_table.bin")
 pwrx_file              = open_output_file("pwrx_table.bin")
+context_switches_file  = open_output_file("context_switches_table.bin")
 
 def trace_begin():
        printdate("Writing to intermediate files...")
@@ -807,6 +842,7 @@ def trace_end():
        copy_output_file(pwre_file,             "pwre")
        copy_output_file(exstop_file,           "exstop")
        copy_output_file(pwrx_file,             "pwrx")
+       copy_output_file(context_switches_file, "context_switches")
 
        printdate("Removing intermediate files...")
        remove_output_file(evsel_file)
@@ -828,6 +864,7 @@ def trace_end():
        remove_output_file(pwre_file)
        remove_output_file(exstop_file)
        remove_output_file(pwrx_file)
+       remove_output_file(context_switches_file)
        os.rmdir(output_dir_name)
        printdate("Adding primary keys")
        do_query(query, 'ALTER TABLE selected_events ADD PRIMARY KEY (id)')
@@ -849,6 +886,7 @@ def trace_end():
        do_query(query, 'ALTER TABLE pwre            ADD PRIMARY KEY (id)')
        do_query(query, 'ALTER TABLE exstop          ADD PRIMARY KEY (id)')
        do_query(query, 'ALTER TABLE pwrx            ADD PRIMARY KEY (id)')
+       do_query(query, 'ALTER TABLE context_switches ADD PRIMARY KEY (id)')
 
        printdate("Adding foreign keys")
        do_query(query, 'ALTER TABLE threads '
@@ -900,6 +938,12 @@ def trace_end():
                                        'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')
        do_query(query, 'ALTER TABLE  pwrx '
                                        'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')
+       do_query(query, 'ALTER TABLE  context_switches '
+                                       'ADD CONSTRAINT machinefk   FOREIGN KEY (machine_id)    REFERENCES machines (id),'
+                                       'ADD CONSTRAINT toutfk      FOREIGN KEY (thread_out_id) REFERENCES threads  (id),'
+                                       'ADD CONSTRAINT tinfk       FOREIGN KEY (thread_in_id)  REFERENCES threads  (id),'
+                                       'ADD CONSTRAINT coutfk      FOREIGN KEY (comm_out_id)   REFERENCES comms    (id),'
+                                       'ADD CONSTRAINT cinfk       FOREIGN KEY (comm_in_id)    REFERENCES comms    (id)')
 
        printdate("Dropping unused tables")
        if is_table_empty("ptwrite"):
@@ -912,6 +956,8 @@ def trace_end():
                drop("pwrx")
                if is_table_empty("cbr"):
                        drop("cbr")
+       if is_table_empty("context_switches"):
+               drop("context_switches")
 
        if (unhandled_count):
                printdate("Warning: ", unhandled_count, " unhandled events")
@@ -1058,3 +1104,8 @@ def synth_data(id, config, raw_buf, *x):
                pwrx(id, raw_buf)
        elif config == 5:
                cbr(id, raw_buf)
+
+def context_switch_table(id, machine_id, time, cpu, thread_out_id, comm_out_id, thread_in_id, comm_in_id, flags, *x):
+       fmt = "!hiqiqiqiiiqiqiqiqii"
+       value = struct.pack(fmt, 9, 8, id, 8, machine_id, 8, time, 4, cpu, 8, thread_out_id, 8, comm_out_id, 8, thread_in_id, 8, comm_in_id, 4, flags)
+       context_switches_file.write(value)