lkml.org 
[lkml]   [2019]   [May]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 20/22] perf scripts python: exported-sql-viewer.py: Add IPC information to Call Graph Graph
    Date
    Enhance the call graph to display IPC information if it is available.

    Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
    ---
    .../scripts/python/exported-sql-viewer.py | 69 +++++++++++++++----
    1 file changed, 56 insertions(+), 13 deletions(-)

    diff --git a/tools/perf/scripts/python/exported-sql-viewer.py b/tools/perf/scripts/python/exported-sql-viewer.py
    index b3508bd4eb00..f5b1b63995b0 100755
    --- a/tools/perf/scripts/python/exported-sql-viewer.py
    +++ b/tools/perf/scripts/python/exported-sql-viewer.py
    @@ -505,18 +505,24 @@ class CallGraphLevelItemBase(object):

    class CallGraphLevelTwoPlusItemBase(CallGraphLevelItemBase):

    - def __init__(self, glb, params, row, comm_id, thread_id, call_path_id, time, branch_count, parent_item):
    + def __init__(self, glb, params, row, comm_id, thread_id, call_path_id, time, insn_cnt, cyc_cnt, branch_count, parent_item):
    super(CallGraphLevelTwoPlusItemBase, self).__init__(glb, params, row, parent_item)
    self.comm_id = comm_id
    self.thread_id = thread_id
    self.call_path_id = call_path_id
    + self.insn_cnt = insn_cnt
    + self.cyc_cnt = cyc_cnt
    self.branch_count = branch_count
    self.time = time

    def Select(self):
    self.query_done = True;
    query = QSqlQuery(self.glb.db)
    - QueryExec(query, "SELECT call_path_id, name, short_name, COUNT(calls.id), SUM(return_time - call_time), SUM(branch_count)"
    + if self.params.have_ipc:
    + ipc_str = ", SUM(insn_count), SUM(cyc_count)"
    + else:
    + ipc_str = ""
    + QueryExec(query, "SELECT call_path_id, name, short_name, COUNT(calls.id), SUM(return_time - call_time)" + ipc_str + ", SUM(branch_count)"
    " FROM calls"
    " INNER JOIN call_paths ON calls.call_path_id = call_paths.id"
    " INNER JOIN symbols ON call_paths.symbol_id = symbols.id"
    @@ -527,7 +533,15 @@ class CallGraphLevelTwoPlusItemBase(CallGraphLevelItemBase):
    " GROUP BY call_path_id, name, short_name"
    " ORDER BY call_path_id")
    while query.next():
    - child_item = CallGraphLevelThreeItem(self.glb, self.params, self.child_count, self.comm_id, self.thread_id, query.value(0), query.value(1), query.value(2), query.value(3), int(query.value(4)), int(query.value(5)), self)
    + if self.params.have_ipc:
    + insn_cnt = int(query.value(5))
    + cyc_cnt = int(query.value(6))
    + branch_count = int(query.value(7))
    + else:
    + insn_cnt = 0
    + cyc_cnt = 0
    + branch_count = int(query.value(5))
    + child_item = CallGraphLevelThreeItem(self.glb, self.params, self.child_count, self.comm_id, self.thread_id, query.value(0), query.value(1), query.value(2), query.value(3), int(query.value(4)), insn_cnt, cyc_cnt, branch_count, self)
    self.child_items.append(child_item)
    self.child_count += 1

    @@ -535,10 +549,17 @@ class CallGraphLevelTwoPlusItemBase(CallGraphLevelItemBase):

    class CallGraphLevelThreeItem(CallGraphLevelTwoPlusItemBase):

    - def __init__(self, glb, params, row, comm_id, thread_id, call_path_id, name, dso, count, time, branch_count, parent_item):
    - super(CallGraphLevelThreeItem, self).__init__(glb, params, row, comm_id, thread_id, call_path_id, time, branch_count, parent_item)
    + def __init__(self, glb, params, row, comm_id, thread_id, call_path_id, name, dso, count, time, insn_cnt, cyc_cnt, branch_count, parent_item):
    + super(CallGraphLevelThreeItem, self).__init__(glb, params, row, comm_id, thread_id, call_path_id, time, insn_cnt, cyc_cnt, branch_count, parent_item)
    dso = dsoname(dso)
    - self.data = [ name, dso, str(count), str(time), PercentToOneDP(time, parent_item.time), str(branch_count), PercentToOneDP(branch_count, parent_item.branch_count) ]
    + if self.params.have_ipc:
    + insn_pcnt = PercentToOneDP(insn_cnt, parent_item.insn_cnt)
    + cyc_pcnt = PercentToOneDP(cyc_cnt, parent_item.cyc_cnt)
    + br_pcnt = PercentToOneDP(branch_count, parent_item.branch_count)
    + ipc = CalcIPC(cyc_cnt, insn_cnt)
    + self.data = [ name, dso, str(count), str(time), PercentToOneDP(time, parent_item.time), str(insn_cnt), insn_pcnt, str(cyc_cnt), cyc_pcnt, ipc, str(branch_count), br_pcnt ]
    + else:
    + self.data = [ name, dso, str(count), str(time), PercentToOneDP(time, parent_item.time), str(branch_count), PercentToOneDP(branch_count, parent_item.branch_count) ]
    self.dbid = call_path_id

    # Context-sensitive call graph data model level two item
    @@ -546,18 +567,28 @@ class CallGraphLevelThreeItem(CallGraphLevelTwoPlusItemBase):
    class CallGraphLevelTwoItem(CallGraphLevelTwoPlusItemBase):

    def __init__(self, glb, params, row, comm_id, thread_id, pid, tid, parent_item):
    - super(CallGraphLevelTwoItem, self).__init__(glb, params, row, comm_id, thread_id, 1, 0, 0, parent_item)
    - self.data = [str(pid) + ":" + str(tid), "", "", "", "", "", ""]
    + super(CallGraphLevelTwoItem, self).__init__(glb, params, row, comm_id, thread_id, 1, 0, 0, 0, 0, parent_item)
    + if self.params.have_ipc:
    + self.data = [str(pid) + ":" + str(tid), "", "", "", "", "", "", "", "", "", "", ""]
    + else:
    + self.data = [str(pid) + ":" + str(tid), "", "", "", "", "", ""]
    self.dbid = thread_id

    def Select(self):
    super(CallGraphLevelTwoItem, self).Select()
    for child_item in self.child_items:
    self.time += child_item.time
    + self.insn_cnt += child_item.insn_cnt
    + self.cyc_cnt += child_item.cyc_cnt
    self.branch_count += child_item.branch_count
    for child_item in self.child_items:
    child_item.data[4] = PercentToOneDP(child_item.time, self.time)
    - child_item.data[6] = PercentToOneDP(child_item.branch_count, self.branch_count)
    + if self.params.have_ipc:
    + child_item.data[6] = PercentToOneDP(child_item.insn_cnt, self.insn_cnt)
    + child_item.data[8] = PercentToOneDP(child_item.cyc_cnt, self.cyc_cnt)
    + child_item.data[11] = PercentToOneDP(child_item.branch_count, self.branch_count)
    + else:
    + child_item.data[6] = PercentToOneDP(child_item.branch_count, self.branch_count)

    # Context-sensitive call graph data model level one item

    @@ -565,7 +596,10 @@ class CallGraphLevelOneItem(CallGraphLevelItemBase):

    def __init__(self, glb, params, row, comm_id, comm, parent_item):
    super(CallGraphLevelOneItem, self).__init__(glb, params, row, parent_item)
    - self.data = [comm, "", "", "", "", "", ""]
    + if self.params.have_ipc:
    + self.data = [comm, "", "", "", "", "", "", "", "", "", "", ""]
    + else:
    + self.data = [comm, "", "", "", "", "", ""]
    self.dbid = comm_id

    def Select(self):
    @@ -694,14 +728,23 @@ class CallGraphModel(CallGraphModelBase):
    return CallGraphRootItem(self.glb, self.params)

    def columnCount(self, parent=None):
    - return 7
    + if self.params.have_ipc:
    + return 12
    + else:
    + return 7

    def columnHeader(self, column):
    - headers = ["Call Path", "Object", "Count ", "Time (ns) ", "Time (%) ", "Branch Count ", "Branch Count (%) "]
    + if self.params.have_ipc:
    + headers = ["Call Path", "Object", "Count ", "Time (ns) ", "Time (%) ", "Insn Cnt", "Insn Cnt (%)", "Cyc Cnt", "Cyc Cnt (%)", "IPC", "Branch Count ", "Branch Count (%) "]
    + else:
    + headers = ["Call Path", "Object", "Count ", "Time (ns) ", "Time (%) ", "Branch Count ", "Branch Count (%) "]
    return headers[column]

    def columnAlignment(self, column):
    - alignment = [ Qt.AlignLeft, Qt.AlignLeft, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight ]
    + if self.params.have_ipc:
    + alignment = [ Qt.AlignLeft, Qt.AlignLeft, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight ]
    + else:
    + alignment = [ Qt.AlignLeft, Qt.AlignLeft, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight ]
    return alignment[column]

    def DoFindSelect(self, query, match):
    --
    2.17.1
    \
     
     \ /
      Last update: 2019-05-20 13:38    [W:3.615 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site