blob: 8e6f1cd6c1efdcc0bd838bd61f2de865684d33cc [file] [log] [blame]
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08001#!/usr/bin/python
Ahmad Shariffd356fb2012-05-07 12:02:16 -07002#
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08003# Copyright 2011 Google Inc. All Rights Reserved.
4
5import os
6import re
Ahmad Shariffd356fb2012-05-07 12:02:16 -07007
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08008from utils import command_executer
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08009
10
11class PerfProcessor(object):
12 class PerfResults(object):
13 def __init__(self, report, output):
14 self.report = report
15 self.output = output
16
Ahmad Shariffd356fb2012-05-07 12:02:16 -070017 def __init__(self, results_dir, chromeos_root, board, logger_to_use=None):
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080018 self._logger = logger_to_use
19 self._ce = command_executer.GetCommandExecuter(self._logger)
Ahmad Shariffd356fb2012-05-07 12:02:16 -070020 self._results_dir = results_dir
21 self._chromeos_root = chromeos_root
22 self._board = board
23 self._perf_relative_dir = os.path.basename(self._results_dir)
24 self.host_data_file = self.FindSingleFile(
25 "perf.data", os.path.join(
26 chromeos_root,
27 "chroot",
28 self._results_dir.lstrip("/")))
29 self.perf_out = self.FindSingleFile(
30 "perf.out", os.path.join(
31 chromeos_root,
32 "chroot",
33 self._results_dir.lstrip("/")))
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080034
Ahmad Shariffd356fb2012-05-07 12:02:16 -070035 def FindSingleFile(self, name, path):
36 find_command = ("find %s -name %s" % (path, name))
37 ret, out, err = self._ce.RunCommand(find_command, return_output=True)
38 if ret == 0:
39 data_files = out.splitlines()
40 if len(data_files) == 0:
41 # No data file, no report to generate.
42 data_file = None
43 else:
44 assert len(data_files) == 1, "More than 1 perf.out file found"
45 data_file = data_files[0]
46 return data_file
47
48
49 def GeneratePerfResults(self):
50 perf_location = os.path.join(self._results_dir,
51 self._perf_relative_dir)
52 if self.perf_out != None:
53 output = self._ReadPerfOutput()
54
55 if self.host_data_file != None:
56 perf_location = os.path.join(self._results_dir,
57 self._perf_relative_dir)
58 host_perf_location = os.path.dirname(self.host_data_file)
59 report = self._GeneratePerfReport(perf_location,
60 self._chromeos_root,
61 self._board)
62 else:
63 # lets make perf.report have output of stat...
64 report = output
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080065 return PerfProcessor.PerfResults(report, output)
66
67 def ParseStatResults(self, results):
68 output = results.output
69 result = {}
70 p = re.compile("\s*([0-9.]+) +(\S+)")
71 for line in output.split("\n"):
72 match = p.match(line)
73 if match:
74 result[match.group(2)] = match.group(1)
75 return result
76
Ahmad Shariffd356fb2012-05-07 12:02:16 -070077 def _ReadPerfOutput(self):
78 with open(self.perf_out, "rb") as f:
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080079 return f.read()
80
81 def _GeneratePerfReport(self, perf_location, chromeos_root, board):
82 perf_data_file = os.path.join(perf_location, "perf.data")
83 # Attempt to build a perf report and keep it with the results.
84 command = ("/usr/sbin/perf report --symfs=/build/%s"
Ahmad Shariffd356fb2012-05-07 12:02:16 -070085 " --vmlinux /build/%s/usr/lib/debug/boot/vmlinux"
86 " --kallsyms /build/%s/boot/System.map-*"
87 " -i %s --stdio | head -n1000" % (board, board, board,
88 perf_data_file))
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080089 _, out, _ = self._ce.ChrootRunCommand(chromeos_root,
90 command, return_output=True)
91 return out
92
93
94class MockPerfProcessor(object):
95 def __init__(self):
96 pass
97
98 def GeneratePerfReport(self, *args):
99 pass
100
101 def ParseStatResults(self, *args):
102 return {}