1
0
mirror of https://github.com/ARM-software/devlib.git synced 2025-02-07 05:30:44 +00:00

module/sched: SchedDomain: Turn flags definition into an enum

This lets us easily iterate over the known flags, and
makes the code a little neater.
This commit is contained in:
Valentin Schneider 2018-11-08 13:43:52 +00:00 committed by Marc Bonnici
parent 60c2e7721e
commit d376bc10ee

View File

@ -15,6 +15,7 @@
import logging import logging
import re import re
from enum import Enum
from past.builtins import basestring from past.builtins import basestring
@ -138,52 +139,74 @@ class SchedProcFSNode(object):
self._dyn_attrs[key] = self._build_node(key, nodes[key]) self._dyn_attrs[key] = self._build_node(key, nodes[key])
class SchedDomain(SchedProcFSNode): class DocInt(int):
# See https://stackoverflow.com/a/50473952/5096023
def __new__(cls, value, doc):
new = super(DocInt, cls).__new__(cls, value)
new.__doc__ = doc
return new
class SchedDomainFlag(DocInt, Enum):
""" """
Represents a sched domain as seen through procfs Represents a sched domain flag
""" """
# pylint: disable=bad-whitespace # pylint: disable=bad-whitespace
# Domain flags obtained from include/linux/sched/topology.h on v4.17 # Domain flags obtained from include/linux/sched/topology.h on v4.17
# https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux/+/v4.17/include/linux/sched/topology.h#20 # https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux/+/v4.17/include/linux/sched/topology.h#20
SD_LOAD_BALANCE = 0x0001 # Do load balancing on this domain. SD_LOAD_BALANCE = 0x0001, "Do load balancing on this domain"
SD_BALANCE_NEWIDLE = 0x0002 # Balance when about to become idle SD_BALANCE_NEWIDLE = 0x0002, "Balance when about to become idle"
SD_BALANCE_EXEC = 0x0004 # Balance on exec SD_BALANCE_EXEC = 0x0004, "Balance on exec"
SD_BALANCE_FORK = 0x0008 # Balance on fork, clone SD_BALANCE_FORK = 0x0008, "Balance on fork, clone"
SD_BALANCE_WAKE = 0x0010 # Balance on wakeup SD_BALANCE_WAKE = 0x0010, "Balance on wakeup"
SD_WAKE_AFFINE = 0x0020 # Wake task to waking CPU SD_WAKE_AFFINE = 0x0020, "Wake task to waking CPU"
SD_ASYM_CPUCAPACITY = 0x0040 # Groups have different max cpu capacities SD_ASYM_CPUCAPACITY = 0x0040, "Groups have different max cpu capacities"
SD_SHARE_CPUCAPACITY = 0x0080 # Domain members share cpu capacity SD_SHARE_CPUCAPACITY = 0x0080, "Domain members share cpu capacity"
SD_SHARE_POWERDOMAIN = 0x0100 # Domain members share power domain SD_SHARE_POWERDOMAIN = 0x0100, "Domain members share power domain"
SD_SHARE_PKG_RESOURCES = 0x0200 # Domain members share cpu pkg resources SD_SHARE_PKG_RESOURCES = 0x0200, "Domain members share cpu pkg resources"
SD_SERIALIZE = 0x0400 # Only a single load balancing instance SD_SERIALIZE = 0x0400, "Only a single load balancing instance"
SD_ASYM_PACKING = 0x0800 # Place busy groups earlier in the domain SD_ASYM_PACKING = 0x0800, "Place busy groups earlier in the domain"
SD_PREFER_SIBLING = 0x1000 # Prefer to place tasks in a sibling domain SD_PREFER_SIBLING = 0x1000, "Prefer to place tasks in a sibling domain"
SD_OVERLAP = 0x2000 # sched_domains of this level overlap SD_OVERLAP = 0x2000, "Sched_domains of this level overlap"
SD_NUMA = 0x4000 # cross-node balancing SD_NUMA = 0x4000, "Cross-node balancing"
# Only defined in Android # Only defined in Android
# https://android.googlesource.com/kernel/common/+/android-4.14/include/linux/sched/topology.h#29 # https://android.googlesource.com/kernel/common/+/android-4.14/include/linux/sched/topology.h#29
SD_SHARE_CAP_STATES = 0x8000 # Domain members share capacity state SD_SHARE_CAP_STATES = 0x8000, "(Android only) Domain members share capacity state"
# Checked to be valid from v4.4 @classmethod
SD_FLAGS_REF_PARTS = (4, 4, 0) def check_version(cls, target, logger):
@staticmethod
def check_version(target, logger):
""" """
Check the target and see if its kernel version matches our view of the world Check the target and see if its kernel version matches our view of the world
""" """
parts = target.kernel_version.parts parts = target.kernel_version.parts
if parts < SchedDomain.SD_FLAGS_REF_PARTS: # Checked to be valid from v4.4
# Not saved as a class attribute else it'll be converted to an enum
ref_parts = (4, 4, 0)
if parts < ref_parts:
logger.warn( logger.warn(
"Sched domain flags are defined for kernels v{} and up, " "Sched domain flags are defined for kernels v{} and up, "
"but target is running v{}".format(SchedDomain.SD_FLAGS_REF_PARTS, parts) "but target is running v{}".format(ref_parts, parts)
) )
def has_flags(self, flags):
""" def __str__(self):
:returns: Whether 'flags' are set on this sched domain return self.name
"""
return self.flags & flags == flags
class SchedDomain(SchedProcFSNode):
"""
Represents a sched domain as seen through procfs
"""
def __init__(self, nodes):
super(SchedDomain, self).__init__(nodes)
obj_flags = set()
for flag in list(SchedDomainFlag):
if self.flags & flag.value == flag.value:
obj_flags.add(flag)
self.flags = obj_flags
class SchedProcFSData(SchedProcFSNode): class SchedProcFSData(SchedProcFSNode):
@ -226,7 +249,7 @@ class SchedModule(Module):
@staticmethod @staticmethod
def probe(target): def probe(target):
logger = logging.getLogger(SchedModule.name) logger = logging.getLogger(SchedModule.name)
SchedDomain.check_version(target, logger) SchedDomainFlag.check_version(target, logger)
return SchedProcFSData.available(target) return SchedProcFSData.available(target)