aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/scripts/python/call-graph-from-sql.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/scripts/python/call-graph-from-sql.py')
-rw-r--r--tools/perf/scripts/python/call-graph-from-sql.py54
1 files changed, 29 insertions, 25 deletions
diff --git a/tools/perf/scripts/python/call-graph-from-sql.py b/tools/perf/scripts/python/call-graph-from-sql.py
index ada486048ad8..7f2eabe7dacd 100644
--- a/tools/perf/scripts/python/call-graph-from-sql.py
+++ b/tools/perf/scripts/python/call-graph-from-sql.py
@@ -52,6 +52,28 @@ from PySide.QtGui import *
52from PySide.QtSql import * 52from PySide.QtSql import *
53from decimal import * 53from decimal import *
54 54
55# Data formatting helpers
56
57def dsoname(name):
58 if name == "[kernel.kallsyms]":
59 return "[kernel]"
60 return name
61
62# Percent to one decimal place
63
64def PercentToOneDP(n, d):
65 if not d:
66 return "0.0"
67 x = (n * Decimal(100)) / d
68 return str(x.quantize(Decimal(".1"), rounding=ROUND_HALF_UP))
69
70# Helper for queries that must not fail
71
72def QueryExec(query, stmt):
73 ret = query.exec_(stmt)
74 if not ret:
75 raise Exception("Query failed: " + query.lastError().text())
76
55class TreeItem(): 77class TreeItem():
56 78
57 def __init__(self, db, row, parent_item): 79 def __init__(self, db, row, parent_item):
@@ -73,9 +95,7 @@ class TreeItem():
73 def setUpRoot(self): 95 def setUpRoot(self):
74 self.query_done = True 96 self.query_done = True
75 query = QSqlQuery(self.db) 97 query = QSqlQuery(self.db)
76 ret = query.exec_('SELECT id, comm FROM comms') 98 QueryExec(query, 'SELECT id, comm FROM comms')
77 if not ret:
78 raise Exception("Query failed: " + query.lastError().text())
79 while query.next(): 99 while query.next():
80 if not query.value(0): 100 if not query.value(0):
81 continue 101 continue
@@ -91,9 +111,7 @@ class TreeItem():
91 self.child_items = [] 111 self.child_items = []
92 self.child_count = 0 112 self.child_count = 0
93 query = QSqlQuery(self.db) 113 query = QSqlQuery(self.db)
94 ret = query.exec_('SELECT thread_id, ( SELECT pid FROM threads WHERE id = thread_id ), ( SELECT tid FROM threads WHERE id = thread_id ) FROM comm_threads WHERE comm_id = ' + str(comm_id)) 114 QueryExec(query, 'SELECT thread_id, ( SELECT pid FROM threads WHERE id = thread_id ), ( SELECT tid FROM threads WHERE id = thread_id ) FROM comm_threads WHERE comm_id = ' + str(comm_id))
95 if not ret:
96 raise Exception("Query failed: " + query.lastError().text())
97 while query.next(): 115 while query.next():
98 child_item = TreeItem(self.db, self.child_count, self) 116 child_item = TreeItem(self.db, self.child_count, self)
99 self.child_items.append(child_item) 117 self.child_items.append(child_item)
@@ -114,18 +132,6 @@ class TreeItem():
114 def getRow(self): 132 def getRow(self):
115 return self.row 133 return self.row
116 134
117 def timePercent(self, b):
118 if not self.time:
119 return "0.0"
120 x = (b * Decimal(100)) / self.time
121 return str(x.quantize(Decimal('.1'), rounding=ROUND_HALF_UP))
122
123 def branchPercent(self, b):
124 if not self.branch_count:
125 return "0.0"
126 x = (b * Decimal(100)) / self.branch_count
127 return str(x.quantize(Decimal('.1'), rounding=ROUND_HALF_UP))
128
129 def addChild(self, call_path_id, name, dso, count, time, branch_count): 135 def addChild(self, call_path_id, name, dso, count, time, branch_count):
130 child_item = TreeItem(self.db, self.child_count, self) 136 child_item = TreeItem(self.db, self.child_count, self)
131 child_item.comm_id = self.comm_id 137 child_item.comm_id = self.comm_id
@@ -134,14 +140,12 @@ class TreeItem():
134 child_item.branch_count = branch_count 140 child_item.branch_count = branch_count
135 child_item.time = time 141 child_item.time = time
136 child_item.data[0] = name 142 child_item.data[0] = name
137 if dso == "[kernel.kallsyms]": 143 child_item.data[1] = dsoname(dso)
138 dso = "[kernel]"
139 child_item.data[1] = dso
140 child_item.data[2] = str(count) 144 child_item.data[2] = str(count)
141 child_item.data[3] = str(time) 145 child_item.data[3] = str(time)
142 child_item.data[4] = self.timePercent(time) 146 child_item.data[4] = PercentToOneDP(time, self.time)
143 child_item.data[5] = str(branch_count) 147 child_item.data[5] = str(branch_count)
144 child_item.data[6] = self.branchPercent(branch_count) 148 child_item.data[6] = PercentToOneDP(branch_count, self.branch_count)
145 self.child_items.append(child_item) 149 self.child_items.append(child_item)
146 self.child_count += 1 150 self.child_count += 1
147 151
@@ -189,12 +193,12 @@ class TreeItem():
189 self.branch_count = total_branch_count 193 self.branch_count = total_branch_count
190 if self.branch_count: 194 if self.branch_count:
191 for child_item in self.child_items: 195 for child_item in self.child_items:
192 child_item.data[6] = self.branchPercent(child_item.branch_count) 196 child_item.data[6] = PercentToOneDP(child_item.branch_count, self.branch_count)
193 if total_time > self.time: 197 if total_time > self.time:
194 self.time = total_time 198 self.time = total_time
195 if self.time: 199 if self.time:
196 for child_item in self.child_items: 200 for child_item in self.child_items:
197 child_item.data[4] = self.timePercent(child_item.time) 201 child_item.data[4] = PercentToOneDP(child_item.time, self.time)
198 202
199 def childCount(self): 203 def childCount(self):
200 if not self.query_done: 204 if not self.query_done: