Commit 56789f3d authored by Adrian Hunter's avatar Adrian Hunter Committed by Arnaldo Carvalho de Melo

perf scripts python: export-to-postgresql.py: Export switch events

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: default avatarAdrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/20190710085810.1650-22-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 37c1f991
...@@ -482,6 +482,17 @@ do_query(query, 'CREATE TABLE pwrx (' ...@@ -482,6 +482,17 @@ do_query(query, 'CREATE TABLE pwrx ('
'last_cstate integer,' 'last_cstate integer,'
'wake_reason 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 ' do_query(query, 'CREATE VIEW machines_view AS '
'SELECT ' 'SELECT '
'id,' 'id,'
...@@ -695,6 +706,29 @@ do_query(query, 'CREATE VIEW power_events_view AS ' ...@@ -695,6 +706,29 @@ do_query(query, 'CREATE VIEW power_events_view AS '
' INNER JOIN selected_events ON selected_events.id = samples.evsel_id' ' INNER JOIN selected_events ON selected_events.id = samples.evsel_id'
' ORDER BY samples.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_header = struct.pack("!11sii", b"PGCOPY\n\377\r\n\0", 0, 0)
file_trailer = b"\377\377" file_trailer = b"\377\377"
...@@ -759,6 +793,7 @@ mwait_file = open_output_file("mwait_table.bin") ...@@ -759,6 +793,7 @@ mwait_file = open_output_file("mwait_table.bin")
pwre_file = open_output_file("pwre_table.bin") pwre_file = open_output_file("pwre_table.bin")
exstop_file = open_output_file("exstop_table.bin") exstop_file = open_output_file("exstop_table.bin")
pwrx_file = open_output_file("pwrx_table.bin") pwrx_file = open_output_file("pwrx_table.bin")
context_switches_file = open_output_file("context_switches_table.bin")
def trace_begin(): def trace_begin():
printdate("Writing to intermediate files...") printdate("Writing to intermediate files...")
...@@ -807,6 +842,7 @@ def trace_end(): ...@@ -807,6 +842,7 @@ def trace_end():
copy_output_file(pwre_file, "pwre") copy_output_file(pwre_file, "pwre")
copy_output_file(exstop_file, "exstop") copy_output_file(exstop_file, "exstop")
copy_output_file(pwrx_file, "pwrx") copy_output_file(pwrx_file, "pwrx")
copy_output_file(context_switches_file, "context_switches")
printdate("Removing intermediate files...") printdate("Removing intermediate files...")
remove_output_file(evsel_file) remove_output_file(evsel_file)
...@@ -828,6 +864,7 @@ def trace_end(): ...@@ -828,6 +864,7 @@ def trace_end():
remove_output_file(pwre_file) remove_output_file(pwre_file)
remove_output_file(exstop_file) remove_output_file(exstop_file)
remove_output_file(pwrx_file) remove_output_file(pwrx_file)
remove_output_file(context_switches_file)
os.rmdir(output_dir_name) os.rmdir(output_dir_name)
printdate("Adding primary keys") printdate("Adding primary keys")
do_query(query, 'ALTER TABLE selected_events ADD PRIMARY KEY (id)') do_query(query, 'ALTER TABLE selected_events ADD PRIMARY KEY (id)')
...@@ -849,6 +886,7 @@ def trace_end(): ...@@ -849,6 +886,7 @@ def trace_end():
do_query(query, 'ALTER TABLE pwre ADD PRIMARY KEY (id)') 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 exstop ADD PRIMARY KEY (id)')
do_query(query, 'ALTER TABLE pwrx 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") printdate("Adding foreign keys")
do_query(query, 'ALTER TABLE threads ' do_query(query, 'ALTER TABLE threads '
...@@ -900,6 +938,12 @@ def trace_end(): ...@@ -900,6 +938,12 @@ def trace_end():
'ADD CONSTRAINT idfk FOREIGN KEY (id) REFERENCES samples (id)') 'ADD CONSTRAINT idfk FOREIGN KEY (id) REFERENCES samples (id)')
do_query(query, 'ALTER TABLE pwrx ' do_query(query, 'ALTER TABLE pwrx '
'ADD CONSTRAINT idfk FOREIGN KEY (id) REFERENCES samples (id)') '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") printdate("Dropping unused tables")
if is_table_empty("ptwrite"): if is_table_empty("ptwrite"):
...@@ -912,6 +956,8 @@ def trace_end(): ...@@ -912,6 +956,8 @@ def trace_end():
drop("pwrx") drop("pwrx")
if is_table_empty("cbr"): if is_table_empty("cbr"):
drop("cbr") drop("cbr")
if is_table_empty("context_switches"):
drop("context_switches")
if (unhandled_count): if (unhandled_count):
printdate("Warning: ", unhandled_count, " unhandled events") printdate("Warning: ", unhandled_count, " unhandled events")
...@@ -1058,3 +1104,8 @@ def synth_data(id, config, raw_buf, *x): ...@@ -1058,3 +1104,8 @@ def synth_data(id, config, raw_buf, *x):
pwrx(id, raw_buf) pwrx(id, raw_buf)
elif config == 5: elif config == 5:
cbr(id, raw_buf) 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)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment