Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1347)

Unified Diff: tools/telemetry/telemetry/core/platform/power_monitor/msr_power_monitor.py

Issue 577893003: Telemetry: Implement MSR power monitoring on Linux. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase, use rdmsr binary to read the MSRs Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/telemetry/telemetry/core/platform/linux_platform_backend.py ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/telemetry/telemetry/core/platform/power_monitor/msr_power_monitor.py
diff --git a/tools/telemetry/telemetry/core/platform/power_monitor/msr_power_monitor.py b/tools/telemetry/telemetry/core/platform/power_monitor/msr_power_monitor.py
index 038346dfebad4fa71614f4f346a388ca514833f9..624fa114f5ec69df2033edbe85f237208bed9e23 100644
--- a/tools/telemetry/telemetry/core/platform/power_monitor/msr_power_monitor.py
+++ b/tools/telemetry/telemetry/core/platform/power_monitor/msr_power_monitor.py
@@ -23,6 +23,35 @@ def _JoulesToMilliwattHours(value_joules):
return value_joules * 1000 / 3600.
+def _IsSandyBridgeOrLater(vendor, family, model):
+ # Model numbers from:
+ # https://software.intel.com/en-us/articles/intel-architecture-and- \
+ # processor-identification-with-cpuid-model-and-family-numbers
+ # http://www.speedtraq.com
+ return ('Intel' in vendor and family == 6 and
+ (model in (0x2A, 0x2D) or model >= 0x30))
+
+
+def _LinuxCheckCPU():
+ vendor = None
+ family = None
+ model = None
+ cpuinfo = open('/proc/cpuinfo').read().splitlines()
+ for line in cpuinfo:
+ if vendor and family and model:
+ break
+ if line.startswith('vendor_id'):
+ vendor = line.split('\t')[1]
+ elif line.startswith('cpu family'):
+ family = int(line.split(' ')[2])
+ elif line.startswith('model\t\t'):
+ model = int(line.split(' ')[1])
+ if not _IsSandyBridgeOrLater(vendor, family, model):
+ logging.info('Cannot monitor power: pre-Sandy Bridge CPU.')
+ return False
+ return True
+
+
class MsrPowerMonitor(power_monitor.PowerMonitor):
def __init__(self, backend):
super(MsrPowerMonitor, self).__init__()
@@ -31,35 +60,11 @@ class MsrPowerMonitor(power_monitor.PowerMonitor):
self._start_temp_c = None
def CanMonitorPower(self):
- if self._backend.GetOSName() != 'win':
- return False
-
- # This check works on Windows only.
- family, model = map(int, re.match('.+ Family ([0-9]+) Model ([0-9]+)',
- platform.processor()).groups())
- # Model numbers from:
- # https://software.intel.com/en-us/articles/intel-architecture-and- \
- # processor-identification-with-cpuid-model-and-family-numbers
- # http://www.speedtraq.com
- sandy_bridge_or_later = ('Intel' in platform.processor() and family == 6 and
- (model in (0x2A, 0x2D) or model >= 0x30))
- if not sandy_bridge_or_later:
- logging.info('Cannot monitor power: pre-Sandy Bridge CPU.')
- return False
-
- try:
- if self._PackageEnergyJoules() <= 0:
- logging.info('Cannot monitor power: no energy readings.')
- return False
-
- if self._TemperatureCelsius() <= 0:
- logging.info('Cannot monitor power: no temperature readings.')
- return False
- except OSError as e:
- logging.info('Cannot monitor power: %s' % e)
- return False
-
- return True
+ if self._backend.GetOSName() == 'win':
+ return self._WinCanMonitorPower()
+ elif self._backend.GetOSName() == 'linux':
+ return self._LinuxCanMonitorPower()
+ return False
def StartMonitoringPower(self, browser):
assert self._start_energy_j is None and self._start_temp_c is None, (
@@ -105,3 +110,30 @@ class MsrPowerMonitor(power_monitor.PowerMonitor):
package_temp_headroom = (
self._backend.ReadMsr(IA32_PACKAGE_THERM_STATUS) >> 16 & 0x7f)
return tcc_activation_temp - package_temp_headroom
+
+ def _CheckMSRs(self):
+ try:
+ if self._PackageEnergyJoules() <= 0:
+ logging.info('Cannot monitor power: no energy readings.')
+ return False
+
+ if self._TemperatureCelsius() <= 0:
+ logging.info('Cannot monitor power: no temperature readings.')
+ return False
+ except OSError as e:
+ logging.info('Cannot monitor power: %s' % e)
+ return False
+
+ def _WinCanMonitorPower(self):
+ family, model = map(int, re.match('.+ Family ([0-9]+) Model ([0-9]+)',
+ platform.processor()).groups())
+ if not _IsSandyBridgeOrLater(platform.processor(), family, model):
+ logging.info('Cannot monitor power: pre-Sandy Bridge CPU.')
+ return False
+
+ return self._CheckMSRs()
+
+ def _LinuxCanMonitorPower(self):
+ if not _LinuxCheckCPU():
+ return False
+ return self._CheckMSRs()
« no previous file with comments | « tools/telemetry/telemetry/core/platform/linux_platform_backend.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698