diff --git a/supervisor/const.py b/supervisor/const.py index 25ca284e4..6a3ac4f0a 100644 --- a/supervisor/const.py +++ b/supervisor/const.py @@ -68,6 +68,7 @@ ENV_SUPERVISOR_DEV = "SUPERVISOR_DEV" ENV_SUPERVISOR_MACHINE = "SUPERVISOR_MACHINE" ENV_SUPERVISOR_NAME = "SUPERVISOR_NAME" ENV_SUPERVISOR_SHARE = "SUPERVISOR_SHARE" +ENV_SUPERVISOR_CPU_RT = "SUPERVISOR_CPU_RT" REQUEST_FROM = "HASSIO_FROM" diff --git a/supervisor/docker/__init__.py b/supervisor/docker/__init__.py index 9b67b0017..4c1bc984d 100644 --- a/supervisor/docker/__init__.py +++ b/supervisor/docker/__init__.py @@ -2,6 +2,8 @@ from contextlib import suppress from ipaddress import IPv4Address import logging +import os +from pathlib import Path from typing import Any, Dict, Optional import attr @@ -13,6 +15,7 @@ from ..const import ( ATTR_REGISTRIES, DNS_SUFFIX, DOCKER_NETWORK, + ENV_SUPERVISOR_CPU_RT, FILE_HASSIO_DOCKER, SOCKET_DOCKER, ) @@ -55,6 +58,13 @@ class DockerInfo: """Return true, if docker version is supported.""" return self.version >= MIN_SUPPORTED_DOCKER + @property + def support_cpu_realtime(self) -> bool: + """Return true, if CONFIG_RT_GROUP_SCHED is loaded.""" + if not Path("/sys/fs/cgroup/cpu.rt_runtime_us").exists(): + return False + return bool(os.environ.get(ENV_SUPERVISOR_CPU_RT, 0)) + class DockerConfig(JsonConfig): """Home Assistant core object for Docker configuration.""" diff --git a/supervisor/docker/addon.py b/supervisor/docker/addon.py index 6ae801e6b..c95bb6aa3 100644 --- a/supervisor/docker/addon.py +++ b/supervisor/docker/addon.py @@ -276,6 +276,10 @@ class DockerAddon(DockerInterface): @property def cpu_rt_runtime(self) -> Optional[int]: """Limit CPU real-time runtime in microseconds.""" + if not self.sys_docker.info.support_cpu_realtime: + return None + + # If need CPU RT if self.addon.with_realtime: return 950000 return None diff --git a/supervisor/docker/audio.py b/supervisor/docker/audio.py index 98a030fb6..08226fccf 100644 --- a/supervisor/docker/audio.py +++ b/supervisor/docker/audio.py @@ -1,6 +1,6 @@ """Audio docker object.""" import logging -from typing import Dict, List +from typing import Dict, List, Optional import docker @@ -61,6 +61,13 @@ class DockerAudio(DockerInterface, CoreSysAttributes): """Generate ulimits for audio.""" return [docker.types.Ulimit(name="rtprio", soft=99)] + @property + def cpu_rt_runtime(self) -> Optional[int]: + """Limit CPU real-time runtime in microseconds.""" + if not self.sys_docker.info.support_cpu_realtime: + return None + return 950000 + def _run(self) -> None: """Run Docker image. @@ -83,7 +90,7 @@ class DockerAudio(DockerInterface, CoreSysAttributes): detach=True, cap_add=self.capabilities, ulimits=self.ulimits, - cpu_rt_runtime=950000, + cpu_rt_runtime=self.cpu_rt_runtime, device_cgroup_rules=self.cgroups_rules, environment={ENV_TIME: self.sys_config.timezone}, volumes=self.volumes,