1
0
Fork 0

Merge pull request #771 from yarda/udev-settle

tuned-main.conf: added startup_udev_settle_wait option
This commit is contained in:
Jaroslav Škarvada 2025-05-07 22:51:59 +02:00 committed by GitHub
commit f828dcf702
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 47 additions and 13 deletions

View file

@ -77,7 +77,7 @@ log_file_max_size = 1MB
# connections_backlog = 1024
# TuneD daemon rollback strategy. Supported values: auto|not_on_exit
# - auto: rollbacks are always performed on a profile switch or
# - auto: rollbacks are always performed on a profile switch or
# graceful TuneD process exit
# - not_on_exit: rollbacks are always performed on a profile
# switch, but not on any kind of TuneD process exit
@ -87,3 +87,13 @@ log_file_max_size = 1MB
# In case of conflicts in profile names, the later directory
# takes precedence
# profile_dirs = /usr/lib/tuned/profiles,/etc/tuned/profiles
# Timeout in seconds to wait until udev settles. Value 0 disables the wait.
# With non-zero wait TuneD startup is delayed until there are no pending
# udev events or the specified timeout occurs.
# The delay can help in situations where there are a lot of udev events
# during TuneD startup and TuneD is too slow to handle them.
# In environments where systemd is utilised for starting TuneD
# it is better to keep this feature disabled and rely on systemd
# functionality (systemd-udev-settle).
startup_udev_settle_wait = 0

View file

@ -106,17 +106,17 @@ PPD_API_COMPATIBILITY = "0.23"
PPD_DBUS_BUS = "org.freedesktop.UPower.PowerProfiles"
PPD_DBUS_BUS_LEGACY = "net.hadess.PowerProfiles"
PPD_DBUS_NAMES = [
{
"bus": PPD_DBUS_BUS,
"namespace": PPD_DBUS_BUS,
"interface": PPD_DBUS_BUS,
"object": "/org/freedesktop/UPower/PowerProfiles"
{
"bus": PPD_DBUS_BUS,
"namespace": PPD_DBUS_BUS,
"interface": PPD_DBUS_BUS,
"object": "/org/freedesktop/UPower/PowerProfiles"
},
{
"bus": PPD_DBUS_BUS_LEGACY,
"namespace": PPD_DBUS_BUS_LEGACY,
"interface": PPD_DBUS_BUS_LEGACY,
"object": "/net/hadess/PowerProfiles"
{
"bus": PPD_DBUS_BUS_LEGACY,
"namespace": PPD_DBUS_BUS_LEGACY,
"interface": PPD_DBUS_BUS_LEGACY,
"object": "/net/hadess/PowerProfiles"
}
]
@ -146,6 +146,7 @@ CFG_UNIX_SOCKET_CONNECTIONS_BACKLOG = "connections_backlog"
CFG_CPU_EPP_FLAG = "hwp_epp"
CFG_ROLLBACK = "rollback"
CFG_PROFILE_DIRS = "profile_dirs"
CFG_STARTUP_UDEV_SETTLE_WAIT = "startup_udev_settle_wait"
# no_daemon mode
CFG_DEF_DAEMON = True
@ -197,6 +198,8 @@ CFG_FUNC_UNIX_SOCKET_CONNECTIONS_BACKLOG = "getint"
CFG_DEF_ROLLBACK = "auto"
# default profile directories
CFG_DEF_PROFILE_DIRS = [SYSTEM_PROFILES_DIR, USER_PROFILES_DIR]
# default startup udev settle wait
CFG_DEF_STARTUP_UDEV_SETTLE_WAIT = 0
PATH_CPU_DMA_LATENCY = "/dev/cpu_dma_latency"

View file

@ -6,6 +6,8 @@ import threading
import tuned.consts as consts
from tuned.utils.commands import commands
from tuned.plugins import hotplug
import pyudev
import time
__all__ = ["Controller"]
@ -54,13 +56,29 @@ class Controller(tuned.exports.interfaces.ExportableInterface):
Controller main loop. The call is blocking.
"""
log.info("starting controller")
self._terminate.clear()
wait_settle = self._global_config.get_int(consts.CFG_STARTUP_UDEV_SETTLE_WAIT, \
consts.CFG_DEF_STARTUP_UDEV_SETTLE_WAIT)
if wait_settle > 0:
log.info("waiting for udev to settle")
monitor = pyudev.Monitor.from_netlink(pyudev.Context())
p = True
t = time.time()
while time.time() < (t + wait_settle) and not self._terminate.is_set() and p:
p = monitor.poll(timeout = 1)
if not self._terminate.is_set():
if p:
log.info("udev settle timed out")
else:
log.info("udev settled")
del monitor
res = self.start()
daemon = self._global_config.get_bool(consts.CFG_DAEMON, consts.CFG_DEF_DAEMON)
if not res and daemon:
exports.start()
if daemon:
self._terminate.clear()
# we have to pass some timeout, otherwise signals will not work
while not self._cmd.wait(self._terminate, 1):
exports.period_check()

View file

@ -75,7 +75,10 @@ class GlobalConfig():
if isinstance(i, int):
return i
else:
return int(i, 0)
try:
return int(i, 0)
except ValueError:
log.error("Error parsing integer '%s', using '%d'." %(str(i), default))
return default
def get_list(self, key, default = []):