aboutsummaryrefslogtreecommitdiff
path: root/crosperf/perf_processor.py
diff options
context:
space:
mode:
Diffstat (limited to 'crosperf/perf_processor.py')
-rw-r--r--crosperf/perf_processor.py68
1 files changed, 53 insertions, 15 deletions
diff --git a/crosperf/perf_processor.py b/crosperf/perf_processor.py
index 031f35d2..8e6f1cd6 100644
--- a/crosperf/perf_processor.py
+++ b/crosperf/perf_processor.py
@@ -1,11 +1,11 @@
#!/usr/bin/python
-
+#
# Copyright 2011 Google Inc. All Rights Reserved.
import os
import re
+
from utils import command_executer
-from utils import utils
class PerfProcessor(object):
@@ -14,18 +14,54 @@ class PerfProcessor(object):
self.report = report
self.output = output
- def __init__(self, logger_to_use=None):
+ def __init__(self, results_dir, chromeos_root, board, logger_to_use=None):
self._logger = logger_to_use
self._ce = command_executer.GetCommandExecuter(self._logger)
+ self._results_dir = results_dir
+ self._chromeos_root = chromeos_root
+ self._board = board
+ self._perf_relative_dir = os.path.basename(self._results_dir)
+ self.host_data_file = self.FindSingleFile(
+ "perf.data", os.path.join(
+ chromeos_root,
+ "chroot",
+ self._results_dir.lstrip("/")))
+ self.perf_out = self.FindSingleFile(
+ "perf.out", os.path.join(
+ chromeos_root,
+ "chroot",
+ self._results_dir.lstrip("/")))
+
+ def FindSingleFile(self, name, path):
+ find_command = ("find %s -name %s" % (path, name))
+ ret, out, err = self._ce.RunCommand(find_command, return_output=True)
+ if ret == 0:
+ data_files = out.splitlines()
+ if len(data_files) == 0:
+ # No data file, no report to generate.
+ data_file = None
+ else:
+ assert len(data_files) == 1, "More than 1 perf.out file found"
+ data_file = data_files[0]
+ return data_file
+
+
+ def GeneratePerfResults(self):
+ perf_location = os.path.join(self._results_dir,
+ self._perf_relative_dir)
+ if self.perf_out != None:
+ output = self._ReadPerfOutput()
- def GeneratePerfResults(self, results_dir, chromeos_root, board):
- perf_location = os.path.join(results_dir,
- os.path.basename(results_dir),
- "profiling/iteration.1")
- host_perf_location = os.path.join(chromeos_root, "chroot",
- perf_location.lstrip("/"))
- report = self._GeneratePerfReport(perf_location, chromeos_root, board)
- output = self._ReadPerfOutput(host_perf_location)
+ if self.host_data_file != None:
+ perf_location = os.path.join(self._results_dir,
+ self._perf_relative_dir)
+ host_perf_location = os.path.dirname(self.host_data_file)
+ report = self._GeneratePerfReport(perf_location,
+ self._chromeos_root,
+ self._board)
+ else:
+ # lets make perf.report have output of stat...
+ report = output
return PerfProcessor.PerfResults(report, output)
def ParseStatResults(self, results):
@@ -38,16 +74,18 @@ class PerfProcessor(object):
result[match.group(2)] = match.group(1)
return result
- def _ReadPerfOutput(self, perf_location):
- perf_output_file = os.path.join(perf_location, "perf.out")
- with open(perf_output_file, "rb") as f:
+ def _ReadPerfOutput(self):
+ with open(self.perf_out, "rb") as f:
return f.read()
def _GeneratePerfReport(self, perf_location, chromeos_root, board):
perf_data_file = os.path.join(perf_location, "perf.data")
# Attempt to build a perf report and keep it with the results.
command = ("/usr/sbin/perf report --symfs=/build/%s"
- " -i %s --stdio | head -n1000" % (board, perf_data_file))
+ " --vmlinux /build/%s/usr/lib/debug/boot/vmlinux"
+ " --kallsyms /build/%s/boot/System.map-*"
+ " -i %s --stdio | head -n1000" % (board, board, board,
+ perf_data_file))
_, out, _ = self._ce.ChrootRunCommand(chromeos_root,
command, return_output=True)
return out