799 lines · 24.1 KB · Python
RawDownload
 do_query(query, 'CREATE VIEW pwrx_view AS '	'SELECT '		'pwrx.id,'		'time,'		'cpu,'		'deepest_cstate,'		'last_cstate,'		'CASE     WHEN wake_reason=1 THEN \'Interrupt\''			' WHEN wake_reason=2 THEN \'Timer Deadline\''			' WHEN wake_reason=4 THEN \'Monitored Address\''			' WHEN wake_reason=8 THEN \'HW\''			' ELSE wake_reason '		'END AS wake_reason'	' FROM pwrx'	' INNER JOIN samples ON samples.id = pwrx.id') do_query(query, 'CREATE VIEW power_events_view AS '	'SELECT '		'samples.id,'		'time,'		'cpu,'		'selected_events.name AS event,'		'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT cbr FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS cbr,'		'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT mhz FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS mhz,'		'CASE WHEN selected_events.name=\'cbr\' THEN (SELECT percent FROM cbr WHERE cbr.id = samples.id) ELSE "" END AS percent,'		'CASE WHEN selected_events.name=\'mwait\' THEN (SELECT ' + emit_to_hex('hints') + ' FROM mwait WHERE mwait.id = samples.id) ELSE "" END AS hints_hex,'		'CASE WHEN selected_events.name=\'mwait\' THEN (SELECT ' + emit_to_hex('extensions') + ' FROM mwait WHERE mwait.id = samples.id) ELSE "" END AS extensions_hex,'		'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT cstate FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS cstate,'		'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT subcstate FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS subcstate,'		'CASE WHEN selected_events.name=\'pwre\' THEN (SELECT hw FROM pwre WHERE pwre.id = samples.id) ELSE "" END AS hw,'		'CASE WHEN selected_events.name=\'exstop\' THEN (SELECT exact_ip FROM exstop WHERE exstop.id = samples.id) ELSE "" END AS exact_ip,'		'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT deepest_cstate FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS deepest_cstate,'		'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT last_cstate FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS last_cstate,'		'CASE WHEN selected_events.name=\'pwrx\' THEN (SELECT '			'CASE     WHEN wake_reason=1 THEN \'Interrupt\''				' WHEN wake_reason=2 THEN \'Timer Deadline\''				' WHEN wake_reason=4 THEN \'Monitored Address\''				' WHEN wake_reason=8 THEN \'HW\''				' ELSE wake_reason '			'END'		' FROM pwrx WHERE pwrx.id = samples.id) ELSE "" END AS wake_reason'	' FROM samples'	' INNER JOIN selected_events ON selected_events.id = evsel_id'	' WHERE selected_events.name IN (\'cbr\',\'mwait\',\'exstop\',\'pwre\',\'pwrx\')') 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 context_switches.flags '		'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') do_query(query, 'END TRANSACTION') evsel_query = QSqlQuery(db)evsel_query.prepare("INSERT INTO selected_events VALUES (?, ?)")machine_query = QSqlQuery(db)machine_query.prepare("INSERT INTO machines VALUES (?, ?, ?)")thread_query = QSqlQuery(db)thread_query.prepare("INSERT INTO threads VALUES (?, ?, ?, ?, ?)")comm_query = QSqlQuery(db)comm_query.prepare("INSERT INTO comms VALUES (?, ?, ?, ?, ?)")comm_thread_query = QSqlQuery(db)comm_thread_query.prepare("INSERT INTO comm_threads VALUES (?, ?, ?)")dso_query = QSqlQuery(db)dso_query.prepare("INSERT INTO dsos VALUES (?, ?, ?, ?, ?)")symbol_query = QSqlQuery(db)symbol_query.prepare("INSERT INTO symbols VALUES (?, ?, ?, ?, ?, ?)")branch_type_query = QSqlQuery(db)branch_type_query.prepare("INSERT INTO branch_types VALUES (?, ?)")sample_query = QSqlQuery(db)if branches:	sample_query.prepare("INSERT INTO samples VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")else:	sample_query.prepare("INSERT INTO samples VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")if perf_db_export_calls or perf_db_export_callchains:	call_path_query = QSqlQuery(db)	call_path_query.prepare("INSERT INTO call_paths VALUES (?, ?, ?, ?)")if perf_db_export_calls:	call_query = QSqlQuery(db)	call_query.prepare("INSERT INTO calls VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")ptwrite_query = QSqlQuery(db)ptwrite_query.prepare("INSERT INTO ptwrite VALUES (?, ?, ?)")cbr_query = QSqlQuery(db)cbr_query.prepare("INSERT INTO cbr VALUES (?, ?, ?, ?)")mwait_query = QSqlQuery(db)mwait_query.prepare("INSERT INTO mwait VALUES (?, ?, ?)")pwre_query = QSqlQuery(db)pwre_query.prepare("INSERT INTO pwre VALUES (?, ?, ?, ?)")exstop_query = QSqlQuery(db)exstop_query.prepare("INSERT INTO exstop VALUES (?, ?)")pwrx_query = QSqlQuery(db)pwrx_query.prepare("INSERT INTO pwrx VALUES (?, ?, ?, ?)")context_switch_query = QSqlQuery(db)context_switch_query.prepare("INSERT INTO context_switches VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)") def trace_begin():	printdate("Writing records...")	do_query(query, 'BEGIN TRANSACTION')	# id == 0 means unknown.  It is easier to create records for them than replace the zeroes with NULLs	evsel_table(0, "unknown")	machine_table(0, 0, "unknown")	thread_table(0, 0, 0, -1, -1)	comm_table(0, "unknown", 0, 0, 0)	dso_table(0, 0, "unknown", "unknown", "")	symbol_table(0, 0, 0, 0, 0, "unknown")	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)	if perf_db_export_calls or perf_db_export_callchains:		call_path_table(0, 0, 0, 0)		call_return_table(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) unhandled_count = 0 def is_table_empty(table_name):	do_query(query, 'SELECT * FROM ' + table_name + ' LIMIT 1');	if query.next():		return False	return True def drop(table_name):	do_query(query, 'DROP VIEW ' + table_name + '_view');	do_query(query, 'DROP TABLE ' + table_name); def trace_end():	do_query(query, 'END TRANSACTION') 	printdate("Adding indexes")	if perf_db_export_calls:		do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)')		do_query(query, 'CREATE INDEX pid_idx ON calls (parent_id)')		do_query(query, 'ALTER TABLE comms ADD has_calls boolean')		do_query(query, 'UPDATE comms SET has_calls = 1 WHERE comms.id IN (SELECT DISTINCT comm_id FROM calls)') 	printdate("Dropping unused tables")	if is_table_empty("ptwrite"):		drop("ptwrite")	if is_table_empty("mwait") and is_table_empty("pwre") and is_table_empty("exstop") and is_table_empty("pwrx"):		do_query(query, 'DROP VIEW power_events_view');		drop("mwait")		drop("pwre")		drop("exstop")		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")	printdate("Done") def trace_unhandled(event_name, context, event_fields_dict):	global unhandled_count	unhandled_count += 1 def sched__sched_switch(*x):	pass def bind_exec(q, n, x):	for xx in x[0:n]:		q.addBindValue(str(xx))	do_query_(q) def evsel_table(*x):	bind_exec(evsel_query, 2, x) def machine_table(*x):	bind_exec(machine_query, 3, x) def thread_table(*x):	bind_exec(thread_query, 5, x) def comm_table(*x):	bind_exec(comm_query, 5, x) def comm_thread_table(*x):	bind_exec(comm_thread_query, 3, x) def dso_table(*x):	bind_exec(dso_query, 5, x) def symbol_table(*x):	bind_exec(symbol_query, 6, x) def branch_type_table(*x):	bind_exec(branch_type_query, 2, x) def sample_table(*x):	if branches:		for xx in x[0:15]:			sample_query.addBindValue(str(xx))		for xx in x[19:25]:			sample_query.addBindValue(str(xx))		do_query_(sample_query)	else:		bind_exec(sample_query, 25, x) def call_path_table(*x):	bind_exec(call_path_query, 4, x) def call_return_table(*x):	bind_exec(call_query, 14, x) def ptwrite(id, raw_buf):	data = struct.unpack_from("<IQ", raw_buf)	flags = data[0]	payload = data[1]	exact_ip = flags & 1	ptwrite_query.addBindValue(str(id))	ptwrite_query.addBindValue(str(payload))	ptwrite_query.addBindValue(str(exact_ip))	do_query_(ptwrite_query) def cbr(id, raw_buf):	data = struct.unpack_from("<BBBBII", raw_buf)	cbr = data[0]	MHz = (data[4] + 500) / 1000	percent = ((cbr * 1000 / data[2]) + 5) / 10	cbr_query.addBindValue(str(id))	cbr_query.addBindValue(str(cbr))	cbr_query.addBindValue(str(MHz))	cbr_query.addBindValue(str(percent))	do_query_(cbr_query) def mwait(id, raw_buf):	data = struct.unpack_from("<IQ", raw_buf)	payload = data[1]	hints = payload & 0xff	extensions = (payload >> 32) & 0x3	mwait_query.addBindValue(str(id))	mwait_query.addBindValue(str(hints))	mwait_query.addBindValue(str(extensions))	do_query_(mwait_query) def pwre(id, raw_buf):	data = struct.unpack_from("<IQ", raw_buf)	payload = data[1]	hw = (payload >> 7) & 1	cstate = (payload >> 12) & 0xf	subcstate = (payload >> 8) & 0xf	pwre_query.addBindValue(str(id))	pwre_query.addBindValue(str(cstate))	pwre_query.addBindValue(str(subcstate))	pwre_query.addBindValue(str(hw))	do_query_(pwre_query) def exstop(id, raw_buf):	data = struct.unpack_from("<I", raw_buf)	flags = data[0]	exact_ip = flags & 1	exstop_query.addBindValue(str(id))	exstop_query.addBindValue(str(exact_ip))	do_query_(exstop_query) def pwrx(id, raw_buf):	data = struct.unpack_from("<IQ", raw_buf)	payload = data[1]	deepest_cstate = payload & 0xf	last_cstate = (payload >> 4) & 0xf	wake_reason = (payload >> 8) & 0xf	pwrx_query.addBindValue(str(id))	pwrx_query.addBindValue(str(deepest_cstate))	pwrx_query.addBindValue(str(last_cstate))	pwrx_query.addBindValue(str(wake_reason))	do_query_(pwrx_query) def synth_data(id, config, raw_buf, *x):	if config == 0:		ptwrite(id, raw_buf)	elif config == 1:		mwait(id, raw_buf)	elif config == 2:		pwre(id, raw_buf)	elif config == 3:		exstop(id, raw_buf)	elif config == 4:		pwrx(id, raw_buf)	elif config == 5:		cbr(id, raw_buf) def context_switch_table(*x):	bind_exec(context_switch_query, 9, x)

Lines 501–799 of 799. Previous lines