diff --git a/external/devlib/devlib/module/cgroups.py b/external/devlib/devlib/module/cgroups.py index 6cbab19e08900bd4ab4af4a5a988ca986ce3533c..b3cdb1d5d5ef6c90e74b2570eba8a43cc04edb72 100644 --- a/external/devlib/devlib/module/cgroups.py +++ b/external/devlib/devlib/module/cgroups.py @@ -411,7 +411,7 @@ class CgroupsModule(Module): for line in self.target.execute('{} cat /proc/cgroups'\ .format(self.target.busybox), as_root=self.target.is_rooted).splitlines()[1:]: line = line.strip() - if not line or line.startswith('#'): + if not line or line.startswith('#') or line.endswith('0'): continue name, hierarchy, num_cgroups, enabled = line.split() subsystems.append(CgroupSubsystemEntry(name, diff --git a/external/devlib/devlib/module/cpuidle.py b/external/devlib/devlib/module/cpuidle.py index 93774bee016adafbc5ddd491c22a816fc4352e98..7b1704c73ac198911d8573b90e477c396b7b48a4 100644 --- a/external/devlib/devlib/module/cpuidle.py +++ b/external/devlib/devlib/module/cpuidle.py @@ -19,7 +19,9 @@ from operator import attrgetter from pprint import pformat from devlib.module import Module +from devlib.exception import TargetStableError from devlib.utils.types import integer, boolean +from devlib.utils.misc import memoized class CpuidleState(object): @@ -170,8 +172,32 @@ class Cpuidle(Module): def get_driver(self): return self.target.read_value(self.target.path.join(self.root_path, 'current_driver')) + @memoized + def list_governors(self): + """Returns a list of supported idle governors.""" + sysfile = self.target.path.join(self.root_path, 'available_governors') + output = self.target.read_value(sysfile) + return output.strip().split() + def get_governor(self): + """Returns the currently selected idle governor.""" path = self.target.path.join(self.root_path, 'current_governor_ro') if not self.target.file_exists(path): path = self.target.path.join(self.root_path, 'current_governor') return self.target.read_value(path) + + def set_governor(self, governor): + """ + Set the idle governor for the system. + + :param governor: The name of the governor to be used. This must be + supported by the specific device. + + :raises TargetStableError if governor is not supported by the CPU, or + if, for some reason, the governor could not be set. + """ + supported = self.list_governors() + if governor not in supported: + raise TargetStableError('Governor {} not supported'.format(governor)) + sysfile = self.target.path.join(self.root_path, 'current_governor') + self.target.write_value(sysfile, governor) diff --git a/external/devlib/devlib/utils/android.py b/external/devlib/devlib/utils/android.py index 32afa96b0bd2e877b7333c667bbe120235e95316..b46a825d8d9f389b4e0d514236b905d309553b77 100755 --- a/external/devlib/devlib/utils/android.py +++ b/external/devlib/devlib/utils/android.py @@ -385,9 +385,18 @@ class AdbConnection(ConnectionBase): def adb_root(self, enable=True): cmd = 'root' if enable else 'unroot' - output = adb_command(self.device, cmd, timeout=30, adb_server=self.adb_server) - if 'cannot run as root in production builds' in output: - raise TargetStableError(output) + try: + output = adb_command(self.device, cmd, timeout=30, adb_server=self.adb_server) + except subprocess.CalledProcessError as e: + # Ignore if we're already root + if 'adbd is already running as root' in e.output: + pass + else: + raise + else: + # Check separately as this does not cause a error exit code. + if 'cannot run as root in production builds' in output: + raise TargetStableError(output) AdbConnection._connected_as_root[self.device] = enable def wait_for_device(self, timeout=30):