OLD | NEW |
1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
| 5 import logging |
| 6 import time |
5 | 7 |
6 import logging | |
7 from pylib import android_commands | 8 from pylib import android_commands |
8 from pylib.device import device_utils | 9 from pylib.device import device_utils |
9 | 10 |
10 | 11 |
11 class PerfControl(object): | 12 class PerfControl(object): |
12 """Provides methods for setting the performance mode of a device.""" | 13 """Provides methods for setting the performance mode of a device.""" |
13 _SCALING_GOVERNOR_FMT = ( | 14 _SCALING_GOVERNOR_FMT = ( |
14 '/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor') | 15 '/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor') |
15 _KERNEL_MAX = '/sys/devices/system/cpu/kernel_max' | 16 _KERNEL_MAX = '/sys/devices/system/cpu/kernel_max' |
16 | 17 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 | 52 |
52 def _SetScalingGovernorInternal(self, value): | 53 def _SetScalingGovernorInternal(self, value): |
53 for cpu in range(self._kernel_max + 1): | 54 for cpu in range(self._kernel_max + 1): |
54 scaling_governor_file = PerfControl._SCALING_GOVERNOR_FMT % cpu | 55 scaling_governor_file = PerfControl._SCALING_GOVERNOR_FMT % cpu |
55 if self._device.old_interface.FileExistsOnDevice(scaling_governor_file): | 56 if self._device.old_interface.FileExistsOnDevice(scaling_governor_file): |
56 logging.info('Writing scaling governor mode \'%s\' -> %s', | 57 logging.info('Writing scaling governor mode \'%s\' -> %s', |
57 value, scaling_governor_file) | 58 value, scaling_governor_file) |
58 self._device.old_interface.SetProtectedFileContents( | 59 self._device.old_interface.SetProtectedFileContents( |
59 scaling_governor_file, value) | 60 scaling_governor_file, value) |
60 | 61 |
| 62 def ForceAllCpusOnline(self, force_online): |
| 63 """Force all CPUs on a device to be online. |
| 64 |
| 65 Force every CPU core on an Android device to remain online, or return the |
| 66 cores under system power management control. This is needed to work around |
| 67 a bug in perf which makes it unable to record samples from CPUs that become |
| 68 online when recording is already underway. |
| 69 |
| 70 Args: |
| 71 force_online: True to set all CPUs online, False to return them under |
| 72 system power management control. |
| 73 """ |
| 74 def ForceCpuOnline(online_path): |
| 75 script = 'chmod 644 {0}; echo 1 > {0}; chmod 444 {0}'.format(online_path) |
| 76 self._device.old_interface.RunShellCommandWithSU(script) |
| 77 return self._device.old_interface.GetFileContents(online_path)[0] == '1' |
| 78 |
| 79 def ResetCpu(online_path): |
| 80 self._device.old_interface.RunShellCommandWithSU( |
| 81 'chmod 644 %s' % online_path) |
| 82 |
| 83 def WaitFor(condition): |
| 84 for _ in range(100): |
| 85 if condition(): |
| 86 return |
| 87 time.sleep(0.1) |
| 88 raise RuntimeError('Timed out') |
| 89 |
| 90 cpu_online_files = self._device.old_interface.RunShellCommand( |
| 91 'ls -d /sys/devices/system/cpu/cpu[0-9]*/online') |
| 92 for online_path in cpu_online_files: |
| 93 if force_online: |
| 94 WaitFor(lambda: ForceCpuOnline(online_path)) |
| 95 else: |
| 96 ResetCpu(online_path) |
OLD | NEW |