import tuned-2.24.0-2.el9_5

c9 imports/c9/tuned-2.24.0-2.el9_5
MSVSphere Packaging Team 3 months ago
parent 9e359fe049
commit b656bbac37
Signed by: sys_gitsync
GPG Key ID: B2B0B9F29E528FE8

2
.gitignore vendored

@ -1 +1 @@
SOURCES/tuned-2.21.0.tar.gz
SOURCES/tuned-2.24.0.tar.gz

@ -1 +1 @@
586db5263ea7dabcc57e24aceb249d397d7d0239 SOURCES/tuned-2.21.0.tar.gz
15e516facaececaa788c2decae4bcd9f46781ffc SOURCES/tuned-2.24.0.tar.gz

@ -0,0 +1,281 @@
From 83928aaa29ff281734a12f225a3ea9acd0af96bb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jaroslav=20=C5=A0karvada?= <jskarvad@redhat.com>
Date: Mon, 11 Nov 2024 17:02:44 +0100
Subject: [PATCH] CVE-2024-52336 and CVE-2024-52337 fixes
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- tighten polkit policy
- API method parameters sanity check
- scripts can be executed only from the profile directories
Resolves: CVE-2024-52336
Resolves: CVE-2024-52337
Signed-off-by: Jaroslav Škarvada <jskarvad@redhat.com>
---
com.redhat.tuned.policy | 14 +++++++-------
tuned/consts.py | 4 ++++
tuned/daemon/controller.py | 35 ++++++++++++++++++++++++++--------
tuned/plugins/base.py | 12 ++++++++++++
tuned/plugins/plugin_script.py | 4 ++++
tuned/utils/commands.py | 4 ++++
6 files changed, 58 insertions(+), 15 deletions(-)
diff --git a/com.redhat.tuned.policy b/com.redhat.tuned.policy
index f5c972a..077fb74 100644
--- a/com.redhat.tuned.policy
+++ b/com.redhat.tuned.policy
@@ -43,7 +43,7 @@
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
- <allow_active>yes</allow_active>
+ <allow_active>auth_admin</allow_active>
</defaults>
</action>
@@ -103,7 +103,7 @@
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
- <allow_active>yes</allow_active>
+ <allow_active>auth_admin</allow_active>
</defaults>
</action>
@@ -113,7 +113,7 @@
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
- <allow_active>yes</allow_active>
+ <allow_active>auth_admin</allow_active>
</defaults>
</action>
@@ -123,7 +123,7 @@
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
- <allow_active>yes</allow_active>
+ <allow_active>auth_admin</allow_active>
</defaults>
</action>
@@ -223,7 +223,7 @@
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
- <allow_active>yes</allow_active>
+ <allow_active>auth_admin</allow_active>
</defaults>
</action>
@@ -253,7 +253,7 @@
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
- <allow_active>yes</allow_active>
+ <allow_active>auth_admin</allow_active>
</defaults>
</action>
@@ -263,7 +263,7 @@
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
- <allow_active>yes</allow_active>
+ <allow_active>auth_admin</allow_active>
</defaults>
</action>
diff --git a/tuned/consts.py b/tuned/consts.py
index 912225d..4606aee 100644
--- a/tuned/consts.py
+++ b/tuned/consts.py
@@ -1,4 +1,8 @@
import logging
+import string
+
+NAMES_ALLOWED_CHARS = string.ascii_letters + string.digits + " !@'+-.,/:;_$&*()%<=>?#[]{|}^~" + '"'
+NAMES_MAX_LENGTH = 4096
GLOBAL_CONFIG_FILE = "/etc/tuned/tuned-main.conf"
ACTIVE_PROFILE_FILE = "/etc/tuned/active_profile"
diff --git a/tuned/daemon/controller.py b/tuned/daemon/controller.py
index 4f43d54..726e3a2 100644
--- a/tuned/daemon/controller.py
+++ b/tuned/daemon/controller.py
@@ -189,6 +189,8 @@ class Controller(tuned.exports.interfaces.ExportableInterface):
def switch_profile(self, profile_name, caller = None):
if caller == "":
return (False, "Unauthorized")
+ if not self._cmd.is_valid_name(profile_name):
+ return (False, "Invalid profile_name")
return self._switch_profile(profile_name, True)
@exports.export("", "(bs)")
@@ -262,8 +264,8 @@ class Controller(tuned.exports.interfaces.ExportableInterface):
@exports.export("s", "(bsss)")
def profile_info(self, profile_name, caller = None):
- if caller == "":
- return tuple(False, "", "", "")
+ if caller == "" or not self._cmd.is_valid_name(profile_name):
+ return (False, "", "", "")
if profile_name is None or profile_name == "":
profile_name = self.active_profile()
return tuple(self._daemon.profile_loader.profile_locator.get_profile_attrs(profile_name, [consts.PROFILE_ATTR_SUMMARY, consts.PROFILE_ATTR_DESCRIPTION], [""]))
@@ -294,7 +296,7 @@ class Controller(tuned.exports.interfaces.ExportableInterface):
dictionary -- {plugin_name: {parameter_name: default_value}}
"""
if caller == "":
- return False
+ return {}
plugins = {}
for plugin_class in self._daemon.get_all_plugins():
plugin_name = plugin_class.__module__.split(".")[-1].split("_", 1)[1]
@@ -307,8 +309,8 @@ class Controller(tuned.exports.interfaces.ExportableInterface):
@exports.export("s","s")
def get_plugin_documentation(self, plugin_name, caller = None):
"""Return docstring of plugin's class"""
- if caller == "":
- return False
+ if caller == "" or not self._cmd.is_valid_name(plugin_name):
+ return ""
return self._daemon.get_plugin_documentation(str(plugin_name))
@exports.export("s","a{ss}")
@@ -321,8 +323,8 @@ class Controller(tuned.exports.interfaces.ExportableInterface):
Return:
dictionary -- {parameter_name: hint}
"""
- if caller == "":
- return False
+ if caller == "" or not self._cmd.is_valid_name(plugin_name):
+ return {}
return self._daemon.get_plugin_hints(str(plugin_name))
@exports.export("s", "b")
@@ -335,7 +337,7 @@ class Controller(tuned.exports.interfaces.ExportableInterface):
Return:
bool -- True on success
"""
- if caller == "":
+ if caller == "" or not self._cmd.is_valid_name(path):
return False
if self._daemon._application and self._daemon._application._unix_socket_exporter:
self._daemon._application._unix_socket_exporter.register_signal_path(path)
@@ -349,6 +351,10 @@ class Controller(tuned.exports.interfaces.ExportableInterface):
def instance_acquire_devices(self, devices, instance_name, caller = None):
if caller == "":
return (False, "Unauthorized")
+ if not self._cmd.is_valid_name(devices):
+ return (False, "Invalid devices")
+ if not self._cmd.is_valid_name(instance_name):
+ return (False, "Invalid instance_name")
found = False
for instance_target in self._daemon._unit_manager.instances:
if instance_target.name == instance_name:
@@ -399,6 +405,8 @@ class Controller(tuned.exports.interfaces.ExportableInterface):
"""
if caller == "":
return (False, "Unauthorized", [])
+ if not self._cmd.is_valid_name(plugin_name):
+ return (False, "Invalid plugin_name", [])
if plugin_name != "" and plugin_name not in self.get_all_plugins().keys():
rets = "Plugin '%s' does not exist" % plugin_name
log.error(rets)
@@ -422,6 +430,8 @@ class Controller(tuned.exports.interfaces.ExportableInterface):
"""
if caller == "":
return (False, "Unauthorized", [])
+ if not self._cmd.is_valid_name(instance_name):
+ return (False, "Invalid instance_name", [])
for instance in self._daemon._unit_manager.instances:
if instance.name == instance_name:
return (True, "OK", sorted(list(instance.processed_devices)))
@@ -444,6 +454,13 @@ class Controller(tuned.exports.interfaces.ExportableInterface):
"""
if caller == "":
return (False, "Unauthorized")
+ if not self._cmd.is_valid_name(plugin_name):
+ return (False, "Invalid plugin_name")
+ if not self._cmd.is_valid_name(instance_name):
+ return (False, "Invalid instance_name")
+ for (key, value) in options.items():
+ if not self._cmd.is_valid_name(key) or not self._cmd.is_valid_name(value):
+ return (False, "Invalid options")
plugins = {p.name: p for p in self._daemon._unit_manager.plugins}
if not plugin_name in plugins.keys():
rets = "Plugin '%s' not found" % plugin_name
@@ -499,6 +516,8 @@ class Controller(tuned.exports.interfaces.ExportableInterface):
"""
if caller == "":
return (False, "Unauthorized")
+ if not self._cmd.is_valid_name(instance_name):
+ return (False, "Invalid instance_name")
try:
instance = [i for i in self._daemon._unit_manager.instances if i.name == instance_name][0]
except IndexError:
diff --git a/tuned/plugins/base.py b/tuned/plugins/base.py
index cd54aea..3c4122f 100644
--- a/tuned/plugins/base.py
+++ b/tuned/plugins/base.py
@@ -213,6 +213,14 @@ class Plugin(object):
def _instance_post_static(self, instance, enabling):
pass
+ def _safe_script_path(self, path):
+ path = os.path.realpath(path)
+ profile_paths = self._global_cfg.get_list(consts.CFG_PROFILE_DIRS, consts.CFG_DEF_PROFILE_DIRS)
+ for p in profile_paths:
+ if path.startswith(p):
+ return True
+ return False
+
def _call_device_script(self, instance, script, op, devices, rollback = consts.ROLLBACK_SOFT):
if script is None:
return None
@@ -223,6 +231,10 @@ class Plugin(object):
log.error("Relative paths cannot be used in script_pre or script_post. " \
+ "Use ${i:PROFILE_DIR}.")
return False
+ if not self._safe_script_path(script):
+ log.error("Paths outside of the profile directories cannot be used in the " \
+ + "script_pre or script_post, ignoring script: '%s'" % script)
+ return False
dir_name = os.path.dirname(script)
ret = True
for dev in devices:
diff --git a/tuned/plugins/plugin_script.py b/tuned/plugins/plugin_script.py
index ab605e4..5a5700f 100644
--- a/tuned/plugins/plugin_script.py
+++ b/tuned/plugins/plugin_script.py
@@ -75,6 +75,10 @@ class ScriptPlugin(base.Plugin):
for script in scripts:
environ = os.environ
environ.update(self._variables.get_env())
+ if not self._safe_script_path(script):
+ log.error("Paths outside of the profile directories cannot be used in the script, " \
+ + "ignoring script: '%s'." % script)
+ continue
log.info("calling script '%s' with arguments '%s'" % (script, str(arguments)))
log.debug("using environment '%s'" % str(list(environ.items())))
try:
diff --git a/tuned/utils/commands.py b/tuned/utils/commands.py
index a5a13c3..c4f7c93 100644
--- a/tuned/utils/commands.py
+++ b/tuned/utils/commands.py
@@ -548,3 +548,7 @@ class commands:
import string
trans = string.maketrans(source_chars, dest_chars)
return text.translate(trans)
+
+ # Checks if name contains only valid characters and has valid length or is empty string or None
+ def is_valid_name(self, name):
+ return not name or (all(c in consts.NAMES_ALLOWED_CHARS for c in name) and len(name) <= consts.NAMES_MAX_LENGTH)
--
2.47.0

@ -0,0 +1,508 @@
diff --git a/Makefile b/Makefile
index f73f572..1f30598 100644
--- a/Makefile
+++ b/Makefile
@@ -47,8 +47,8 @@ $(error Failed to determine python library directory)
endif
KERNELINSTALLHOOKDIR = /usr/lib/kernel/install.d
TUNED_SYSTEM_DIR = /usr/lib/tuned
-TUNED_PROFILES_DIR = $(TUNED_SYSTEM_DIR)/profiles
-TUNED_RECOMMEND_DIR = $(TUNED_SYSTEM_DIR)/recommend.d
+TUNED_PROFILES_DIR = /usr/lib/tuned
+TUNED_RECOMMEND_DIR = $(TUNED_PROFILES_DIR)/recommend.d
TUNED_USER_RECOMMEND_DIR = $(SYSCONFDIR)/tuned/recommend.d
BASH_COMPLETIONS = $(DATADIR)/bash-completion/completions
@@ -68,7 +68,7 @@ release-cp: release-dir
tuned-adm.bash dbus.conf recommend.conf tuned-main.conf 00_tuned \
92-tuned.install bootcmdline modules.conf com.redhat.tuned.policy \
tuned-gui.py tuned-gui.glade tuned-ppd.py \
- tuned-gui.desktop functions $(VERSIONED_NAME)
+ tuned-gui.desktop $(VERSIONED_NAME)
cp -a doc experiments libexec man profiles systemtap tuned contrib icons \
tests $(VERSIONED_NAME)
@@ -135,7 +135,6 @@ install-dirs:
mkdir -p $(DESTDIR)/run/tuned
mkdir -p $(DESTDIR)$(DOCDIR)
mkdir -p $(DESTDIR)$(SYSCONFDIR)
- mkdir -p $(DESTDIR)$(SYSCONFDIR)/tuned/profiles
mkdir -p $(DESTDIR)$(TUNED_RECOMMEND_DIR)
mkdir -p $(DESTDIR)$(TUNED_USER_RECOMMEND_DIR)
diff --git a/doc/manual/modules/performance/con_inheritance-between-tuned-profiles.adoc b/doc/manual/modules/performance/con_inheritance-between-tuned-profiles.adoc
index d72cc98..63517ac 100644
--- a/doc/manual/modules/performance/con_inheritance-between-tuned-profiles.adoc
+++ b/doc/manual/modules/performance/con_inheritance-between-tuned-profiles.adoc
@@ -15,7 +15,7 @@ include=[replaceable]_parent_
All settings from the [replaceable]_parent_ profile are loaded in this _child_ profile. In the following sections, the _child_ profile can override certain settings inherited from the [replaceable]_parent_ profile or add new settings not present in the [replaceable]_parent_ profile.
-You can create your own _child_ profile in the [filename]`/etc/tuned/profiles/` directory based on a pre-installed profile in [filename]`/usr/lib/tuned/profiles/` with only some parameters adjusted.
+You can create your own _child_ profile in the [filename]`/etc/tuned/` directory based on a pre-installed profile in [filename]`/usr/lib/tuned/` with only some parameters adjusted.
If the [replaceable]_parent_ profile is updated, such as after a *TuneD* upgrade, the changes are reflected in the _child_ profile.
diff --git a/doc/manual/modules/performance/con_the-location-of-tuned-profiles.adoc b/doc/manual/modules/performance/con_the-location-of-tuned-profiles.adoc
index 4cd35b3..678ff6a 100644
--- a/doc/manual/modules/performance/con_the-location-of-tuned-profiles.adoc
+++ b/doc/manual/modules/performance/con_the-location-of-tuned-profiles.adoc
@@ -5,17 +5,17 @@
[role="_abstract"]
*TuneD* stores profiles in the following directories:
-[filename]`/usr/lib/tuned/profiles/`::
-Distribution-specific profiles are stored in the [filename]`/usr/lib/tuned/profiles/` directory. Each profile has its own directory. The profile consists of the main configuration file called `tuned.conf`, and optionally other files, for example helper scripts.
+[filename]`/usr/lib/tuned/`::
+Distribution-specific profiles are stored in the [filename]`/usr/lib/tuned/` directory. Each profile has its own directory. The profile consists of the main configuration file called `tuned.conf`, and optionally other files, for example helper scripts.
-[filename]`/etc/tuned/profiles/`::
-If you need to customize a profile, copy the profile directory into the [filename]`/etc/tuned/profiles/` directory, which is used for custom profiles, and then adjust it. If there is a system profile and a custom profile of the same name, the custom profile located in [filename]`/etc/tuned/profiles` is used.
+[filename]`/etc/tuned/`::
+If you need to customize a profile, copy the profile directory into the [filename]`/etc/tuned/` directory, which is used for custom profiles, and then adjust it. If there is a system profile and a custom profile of the same name, the custom profile located in [filename]`/etc/tuned/` is used.
.User-defined profile directories
====
-If you want to make TuneD load profiles from a directory other than [filename]`/usr/lib/tuned/profiles/` and [filename]`/etc/tuned/profiles/`, you can list it in [filename]`/etc/tuned/tuned-main.conf` as follows:
+If you want to make TuneD load profiles from a directory other than [filename]`/usr/lib/tuned/` and [filename]`/etc/tuned/`, you can list it in [filename]`/etc/tuned/tuned-main.conf` as follows:
----
-profile_dirs=/usr/lib/tuned/profiles,/etc/tuned/profiles,/my/custom/profiles
+profile_dirs=/usr/lib/tuned,/etc/tuned,/my/custom/profiles
----
In this example, profiles are loaded also from [filename]`/my/custom/profiles/`. If two directories contain profiles with the same names, the one that is listed later takes precedence.
====
diff --git a/doc/manual/modules/performance/proc_creating-new-tuned-profiles.adoc b/doc/manual/modules/performance/proc_creating-new-tuned-profiles.adoc
index 114e83a..36ea120 100644
--- a/doc/manual/modules/performance/proc_creating-new-tuned-profiles.adoc
+++ b/doc/manual/modules/performance/proc_creating-new-tuned-profiles.adoc
@@ -17,11 +17,11 @@ endif::[]
.Procedure
-. In the [filename]`/etc/tuned/profiles/` directory, create a new directory named the same as the profile that you want to create:
+. In the [filename]`/etc/tuned/` directory, create a new directory named the same as the profile that you want to create:
+
[subs=+quotes]
----
-# mkdir /etc/tuned/profiles/[replaceable]_my-profile_
+# mkdir /etc/tuned/[replaceable]_my-profile_
----
. In the new directory, create a file named [filename]`tuned.conf`. Add a `[main]` section and plug-in definitions in it, according to your requirements.
diff --git a/doc/manual/modules/performance/proc_modifying-existing-tuned-profiles.adoc b/doc/manual/modules/performance/proc_modifying-existing-tuned-profiles.adoc
index ba413fe..4447a3f 100644
--- a/doc/manual/modules/performance/proc_modifying-existing-tuned-profiles.adoc
+++ b/doc/manual/modules/performance/proc_modifying-existing-tuned-profiles.adoc
@@ -17,11 +17,11 @@ endif::[]
.Procedure
-. In the [filename]`/etc/tuned/profiles/` directory, create a new directory named the same as the profile that you want to create:
+. In the [filename]`/etc/tuned/` directory, create a new directory named the same as the profile that you want to create:
+
[subs=+quotes]
----
-# mkdir /etc/tuned/profiles/[replaceable]_modified-profile_
+# mkdir /etc/tuned/[replaceable]_modified-profile_
----
. In the new directory, create a file named [filename]`tuned.conf`, and set the `[main]` section as follows:
@@ -75,13 +75,13 @@ See TuneD log file ('/var/log/tuned/tuned.log') for details.
----
// .An alternative approach
-// . Alternatively, copy the directory with a system profile from /usr/lib/tuned/profiles/ to /etc/tuned/profiles/. For example:
+// . Alternatively, copy the directory with a system profile from /user/lib/tuned/ to /etc/tuned/. For example:
// +
// ----
-// # cp -r /usr/lib/tuned/profiles/throughput-performance /etc/tuned/profiles
+// # cp -r /usr/lib/tuned/throughput-performance /etc/tuned
// ----
//
-// . Then, edit the profile in /etc/tuned/profiles/ according to your needs. Note that if there are two profiles of the same name, the profile located in /etc/tuned/profiles/ is loaded. The disadvantage of this approach is that if a system profile is updated after a TuneD upgrade, the changes will not be reflected in the now-outdated modified version.
+// . Then, edit the profile in /etc/tuned according to your needs. Note that if there are two profiles of the same name, the profile located in /etc/tuned/ is loaded. The disadvantage of this approach is that if a system profile is updated after a TuneD upgrade, the changes will not be reflected in the now-outdated modified version.
[role="_additional-resources"]
.Additional resources
diff --git a/doc/manual/modules/performance/proc_setting-the-disk-scheduler-using-tuned.adoc b/doc/manual/modules/performance/proc_setting-the-disk-scheduler-using-tuned.adoc
index 3314717..72a3e66 100644
--- a/doc/manual/modules/performance/proc_setting-the-disk-scheduler-using-tuned.adoc
+++ b/doc/manual/modules/performance/proc_setting-the-disk-scheduler-using-tuned.adoc
@@ -64,7 +64,7 @@ $ tuned-adm active
+
[subs=+quotes]
----
-# mkdir /etc/tuned/profiles/[replaceable]__my-profile__
+# mkdir /etc/tuned/[replaceable]__my-profile__
----
. Find the system unique identifier of the selected block device:
@@ -83,7 +83,7 @@ ID_SERIAL_SHORT=_20120501030900000_
The command in the this example will return all values identified as a World Wide Name (WWN) or serial number associated with the specified block device. Although it is preferred to use a WWN, the WWN is not always available for a given device and any values returned by the example command are acceptable to use as the _device system unique ID_.
====
-. Create the `/etc/tuned/profiles/[replaceable]_my-profile_/tuned.conf` configuration file. In the file, set the following options:
+. Create the `/etc/tuned/_my-profile_/tuned.conf` configuration file. In the file, set the following options:
.. Optional: Include an existing profile:
+
diff --git a/man/tuned-adm.8 b/man/tuned-adm.8
index 972f8b6..f29966d 100644
--- a/man/tuned-adm.8
+++ b/man/tuned-adm.8
@@ -31,8 +31,8 @@ This command line utility allows you to switch between user definable tuning
profiles. Several predefined profiles are already included. You can even
create your own profile, either based on one of the existing ones by copying
it or make a completely new one. The distribution provided profiles are stored
-in subdirectories below \fI/usr/lib/tuned/profiles/\fP and the user defined profiles in
-subdirectories below \fI/etc/tuned/profiles/\fP. If there are profiles with the same name
+in subdirectories below \fI/usr/lib/tuned\fP and the user defined profiles in
+subdirectories below \fI/etc/tuned\fP. If there are profiles with the same name
in both places, user defined profiles have precedence.
.SH "OPTIONS"
diff --git a/man/tuned-profiles.7 b/man/tuned-profiles.7
index c710da9..10cad7b 100644
--- a/man/tuned-profiles.7
+++ b/man/tuned-profiles.7
@@ -30,9 +30,9 @@ performance optimizations but there are also profiles targeted to
low power consumption, low latency and others. You can mostly deduce the
purpose of the profile by its name or you can see full description below.
-The profiles are stored in subdirectories below \fI/usr/lib/tuned/profiles/\fP. If you
-need to customize the profiles, you can copy them to \fI/etc/tuned/profiles/\fP and modify
-them as you need. When loading profiles with the same name, \fI/etc/tuned/profiles/\fP takes
+The profiles are stored in subdirectories below \fI/usr/lib/tuned\fP. If you
+need to customize the profiles, you can copy them to \fI/etc/tuned\fP and modify
+them as you need. When loading profiles with the same name, the /etc/tuned takes
precedence. In such case you will not lose your customized profiles between
TuneD updates.
@@ -143,8 +143,8 @@ throughput\-performance profile.
.SH "FILES"
.nf
-.I /etc/tuned/profiles/*
-.I /usr/lib/tuned/profiles/*
+.I /etc/tuned/*
+.I /usr/lib/tuned/*
.SH "SEE ALSO"
.BR tuned (8)
diff --git a/man/tuned.conf.5 b/man/tuned.conf.5
index c319130..464b6be 100644
--- a/man/tuned.conf.5
+++ b/man/tuned.conf.5
@@ -3,8 +3,8 @@
tuned.conf - TuneD profile definition
.SH DESCRIPTION
This man page documents format of TuneD 2.0 profile definition files.
-The profile definition is stored in /etc/tuned/profiles/<profile_name>/tuned.conf or in
-/usr/lib/tuned/profiles/<profile_name>/tuned.conf file where the /etc/tuned/profiles/ directory has
+The profile definition is stored in /etc/tuned/<profile_name>/tuned.conf or in
+/usr/lib/tuned/<profile_name>/tuned.conf file where the /etc/tuned/ directory has
higher priority.
The \fBtuned.conf\fR configures the profile and it is in ini-file format.
diff --git a/tests/beakerlib/Traceback-caused-by-scheduler-plugin-with/runtest.sh b/tests/beakerlib/Traceback-caused-by-scheduler-plugin-with/runtest.sh
index d5cce71..559bb02 100755
--- a/tests/beakerlib/Traceback-caused-by-scheduler-plugin-with/runtest.sh
+++ b/tests/beakerlib/Traceback-caused-by-scheduler-plugin-with/runtest.sh
@@ -18,7 +18,7 @@
. /usr/share/beakerlib/beakerlib.sh || exit 1
PACKAGE="tuned"
-PROFILE_DIR="/etc/tuned/profiles"
+PROFILE_DIR="/usr/lib/tuned"
rlJournalStart
rlPhaseStartSetup
diff --git a/tests/beakerlib/bz1798183-RFE-support-post-loaded-profile/runtest.sh b/tests/beakerlib/bz1798183-RFE-support-post-loaded-profile/runtest.sh
index 4825ceb..5b871c7 100755
--- a/tests/beakerlib/bz1798183-RFE-support-post-loaded-profile/runtest.sh
+++ b/tests/beakerlib/bz1798183-RFE-support-post-loaded-profile/runtest.sh
@@ -18,11 +18,10 @@
. /usr/share/beakerlib/beakerlib.sh || exit 1
PACKAGE="tuned"
-SYSCONF_DIR=/etc/tuned
-PROFILE_DIR=$SYSCONF_DIR/profiles
-ACTIVE_PROFILE=$SYSCONF_DIR/active_profile
-PROFILE_MODE=$SYSCONF_DIR/profile_mode
-POST_LOADED_PROFILE=$SYSCONF_DIR/post_loaded_profile
+PROFILE_DIR=/etc/tuned
+ACTIVE_PROFILE=/etc/tuned/active_profile
+PROFILE_MODE=/etc/tuned/profile_mode
+POST_LOADED_PROFILE=/etc/tuned/post_loaded_profile
SWAPPINESS=vm.swappiness
DIRTY_RATIO=vm.dirty_ratio
PID_FILE=/run/tuned/tuned.pid
@@ -65,7 +64,7 @@ rlJournalStart
rlImport "tuned/basic"
tunedDisableSystemdRateLimitingStart
rlRun "for PYTHON in $PYTHON_CHECK; do \$PYTHON --version 2>/dev/null && break; done" 0 "Detect python"
- rlRun "rlFileBackup --clean $SYSCONF_DIR"
+ rlRun "rlFileBackup --clean $PROFILE_DIR"
rlRun "cp -r parent $PROFILE_DIR"
rlRun "cp -r parent2 $PROFILE_DIR"
rlRun "cp -r parent-vars $PROFILE_DIR"
diff --git a/tests/beakerlib/bz2071418-TuneD-exits-on-duplicate-config-lines-new/runtest.sh b/tests/beakerlib/bz2071418-TuneD-exits-on-duplicate-config-lines-new/runtest.sh
index 8ecda75..9354b7d 100755
--- a/tests/beakerlib/bz2071418-TuneD-exits-on-duplicate-config-lines-new/runtest.sh
+++ b/tests/beakerlib/bz2071418-TuneD-exits-on-duplicate-config-lines-new/runtest.sh
@@ -18,7 +18,7 @@
. /usr/share/beakerlib/beakerlib.sh || exit 1
PACKAGE="tuned"
-PROFILE_DIR=/etc/tuned/profiles
+PROFILE_DIR="/usr/lib/tuned"
rlJournalStart
rlPhaseStartSetup
diff --git a/tests/beakerlib/error-messages/runtest.sh b/tests/beakerlib/error-messages/runtest.sh
index 12f535e..0a45da2 100755
--- a/tests/beakerlib/error-messages/runtest.sh
+++ b/tests/beakerlib/error-messages/runtest.sh
@@ -18,7 +18,7 @@
. /usr/share/beakerlib/beakerlib.sh || exit 1
PACKAGE="tuned"
-PROFILE_DIR="/usr/lib/tuned/profiles"
+PROFILE_DIR="/usr/lib/tuned"
rlJournalStart
rlPhaseStartSetup
diff --git a/tests/beakerlib/variables-support-in-profiles/runtest.sh b/tests/beakerlib/variables-support-in-profiles/runtest.sh
index 145bd9e..d6d50f7 100755
--- a/tests/beakerlib/variables-support-in-profiles/runtest.sh
+++ b/tests/beakerlib/variables-support-in-profiles/runtest.sh
@@ -18,7 +18,7 @@
. /usr/share/beakerlib/beakerlib.sh || exit 1
PACKAGE="tuned"
-PROFILE_DIR="/usr/lib/tuned/profiles"
+PROFILE_DIR="/usr/lib/tuned"
rlJournalStart
rlPhaseStartSetup
diff --git a/tuned-adm.bash b/tuned-adm.bash
index 18c716b..a4e6075 100644
--- a/tuned-adm.bash
+++ b/tuned-adm.bash
@@ -9,7 +9,7 @@ _tuned_adm()
if [[ "$cword" -eq 1 ]]; then
COMPREPLY=( $(compgen -W "$commands" -- "$cur" ) )
elif [[ "$cword" -eq 2 && ("$prev" == "profile" || "$prev" == "profile_info") ]]; then
- COMPREPLY=( $(compgen -W "$(command find /usr/lib/tuned/profiles /etc/tuned/profiles -mindepth 1 -maxdepth 1 -type d -printf "%f\n")" -- "$cur" ) )
+ COMPREPLY=( $(compgen -W "$(command find /usr/lib/tuned /etc/tuned -mindepth 1 -maxdepth 1 -type d -printf "%f\n")" -- "$cur" ) )
else
COMPREPLY=()
fi
diff --git a/tuned-main.conf b/tuned-main.conf
index 1f1269f..86bca4d 100644
--- a/tuned-main.conf
+++ b/tuned-main.conf
@@ -86,4 +86,4 @@ log_file_max_size = 1MB
# Directories to search for profiles separated by , or ;
# In case of conflicts in profile names, the later directory
# takes precedence
-# profile_dirs = /usr/lib/tuned/profiles,/etc/tuned/profiles
+# profile_dirs = /usr/lib/tuned,/etc/tuned
diff --git a/tuned.spec b/tuned.spec
index fc3c5d4..3e4bf99 100644
--- a/tuned.spec
+++ b/tuned.spec
@@ -329,14 +329,6 @@ if [ -r "%{_sysconfdir}/default/grub" ]; then
%{_sysconfdir}/default/grub
fi
-%if 0%{?fedora} || 0%{?rhel} >= 10
-# migrate all user-defined profiles from /etc/tuned/ to /etc/tuned/profiles/
-for f in %{_sysconfdir}/tuned/*; do
- if [ -e "$f/tuned.conf" ]; then
- mv -n "$f" %{_sysconfdir}/tuned/profiles/
- fi
-done
-%endif
%post ppd
@@ -453,34 +445,33 @@ fi
%exclude %{_sysconfdir}/tuned/realtime-virtual-host-variables.conf
%exclude %{_sysconfdir}/tuned/cpu-partitioning-variables.conf
%exclude %{_sysconfdir}/tuned/cpu-partitioning-powersave-variables.conf
-%exclude %{_prefix}/lib/tuned/profiles/default
-%exclude %{_prefix}/lib/tuned/profiles/desktop-powersave
-%exclude %{_prefix}/lib/tuned/profiles/laptop-ac-powersave
-%exclude %{_prefix}/lib/tuned/profiles/server-powersave
-%exclude %{_prefix}/lib/tuned/profiles/laptop-battery-powersave
-%exclude %{_prefix}/lib/tuned/profiles/enterprise-storage
-%exclude %{_prefix}/lib/tuned/profiles/spindown-disk
-%exclude %{_prefix}/lib/tuned/profiles/sap-netweaver
-%exclude %{_prefix}/lib/tuned/profiles/sap-hana
-%exclude %{_prefix}/lib/tuned/profiles/sap-hana-kvm-guest
-%exclude %{_prefix}/lib/tuned/profiles/mssql
-%exclude %{_prefix}/lib/tuned/profiles/oracle
-%exclude %{_prefix}/lib/tuned/profiles/atomic-host
-%exclude %{_prefix}/lib/tuned/profiles/atomic-guest
-%exclude %{_prefix}/lib/tuned/profiles/realtime
-%exclude %{_prefix}/lib/tuned/profiles/realtime-virtual-guest
-%exclude %{_prefix}/lib/tuned/profiles/realtime-virtual-host
-%exclude %{_prefix}/lib/tuned/profiles/cpu-partitioning
-%exclude %{_prefix}/lib/tuned/profiles/cpu-partitioning-powersave
-%exclude %{_prefix}/lib/tuned/profiles/spectrumscale-ece
-%exclude %{_prefix}/lib/tuned/profiles/postgresql
-%exclude %{_prefix}/lib/tuned/profiles/openshift
-%exclude %{_prefix}/lib/tuned/profiles/openshift-control-plane
-%exclude %{_prefix}/lib/tuned/profiles/openshift-node
+%exclude %{_prefix}/lib/tuned/default
+%exclude %{_prefix}/lib/tuned/desktop-powersave
+%exclude %{_prefix}/lib/tuned/laptop-ac-powersave
+%exclude %{_prefix}/lib/tuned/server-powersave
+%exclude %{_prefix}/lib/tuned/laptop-battery-powersave
+%exclude %{_prefix}/lib/tuned/enterprise-storage
+%exclude %{_prefix}/lib/tuned/spindown-disk
+%exclude %{_prefix}/lib/tuned/sap-netweaver
+%exclude %{_prefix}/lib/tuned/sap-hana
+%exclude %{_prefix}/lib/tuned/sap-hana-kvm-guest
+%exclude %{_prefix}/lib/tuned/mssql
+%exclude %{_prefix}/lib/tuned/oracle
+%exclude %{_prefix}/lib/tuned/atomic-host
+%exclude %{_prefix}/lib/tuned/atomic-guest
+%exclude %{_prefix}/lib/tuned/realtime
+%exclude %{_prefix}/lib/tuned/realtime-virtual-guest
+%exclude %{_prefix}/lib/tuned/realtime-virtual-host
+%exclude %{_prefix}/lib/tuned/cpu-partitioning
+%exclude %{_prefix}/lib/tuned/cpu-partitioning-powersave
+%exclude %{_prefix}/lib/tuned/spectrumscale-ece
+%exclude %{_prefix}/lib/tuned/postgresql
+%exclude %{_prefix}/lib/tuned/openshift
+%exclude %{_prefix}/lib/tuned/openshift-control-plane
+%exclude %{_prefix}/lib/tuned/openshift-node
%{_prefix}/lib/tuned
%dir %{_sysconfdir}/tuned
%dir %{_sysconfdir}/tuned/recommend.d
-%dir %{_sysconfdir}/tuned/profiles
%dir %{_libexecdir}/tuned
%{_libexecdir}/tuned/defirqaffinity*
%config(noreplace) %verify(not size mtime md5) %{_sysconfdir}/tuned/active_profile
@@ -534,40 +525,40 @@ fi
%{_mandir}/man8/scomes.*
%files profiles-sap
-%{_prefix}/lib/tuned/profiles/sap-netweaver
+%{_prefix}/lib/tuned/sap-netweaver
%{_mandir}/man7/tuned-profiles-sap.7*
%files profiles-sap-hana
-%{_prefix}/lib/tuned/profiles/sap-hana
-%{_prefix}/lib/tuned/profiles/sap-hana-kvm-guest
+%{_prefix}/lib/tuned/sap-hana
+%{_prefix}/lib/tuned/sap-hana-kvm-guest
%{_mandir}/man7/tuned-profiles-sap-hana.7*
%files profiles-mssql
-%{_prefix}/lib/tuned/profiles/mssql
+%{_prefix}/lib/tuned/mssql
%{_mandir}/man7/tuned-profiles-mssql.7*
%files profiles-oracle
-%{_prefix}/lib/tuned/profiles/oracle
+%{_prefix}/lib/tuned/oracle
%{_mandir}/man7/tuned-profiles-oracle.7*
%files profiles-atomic
-%{_prefix}/lib/tuned/profiles/atomic-host
-%{_prefix}/lib/tuned/profiles/atomic-guest
+%{_prefix}/lib/tuned/atomic-host
+%{_prefix}/lib/tuned/atomic-guest
%{_mandir}/man7/tuned-profiles-atomic.7*
%files profiles-realtime
%config(noreplace) %{_sysconfdir}/tuned/realtime-variables.conf
-%{_prefix}/lib/tuned/profiles/realtime
+%{_prefix}/lib/tuned/realtime
%{_mandir}/man7/tuned-profiles-realtime.7*
%files profiles-nfv-guest
%config(noreplace) %{_sysconfdir}/tuned/realtime-virtual-guest-variables.conf
-%{_prefix}/lib/tuned/profiles/realtime-virtual-guest
+%{_prefix}/lib/tuned/realtime-virtual-guest
%{_mandir}/man7/tuned-profiles-nfv-guest.7*
%files profiles-nfv-host
%config(noreplace) %{_sysconfdir}/tuned/realtime-virtual-host-variables.conf
-%{_prefix}/lib/tuned/profiles/realtime-virtual-host
+%{_prefix}/lib/tuned/realtime-virtual-host
%{_mandir}/man7/tuned-profiles-nfv-host.7*
%files profiles-nfv
@@ -576,32 +567,32 @@ fi
%files profiles-cpu-partitioning
%config(noreplace) %{_sysconfdir}/tuned/cpu-partitioning-variables.conf
%config(noreplace) %{_sysconfdir}/tuned/cpu-partitioning-powersave-variables.conf
-%{_prefix}/lib/tuned/profiles/cpu-partitioning
-%{_prefix}/lib/tuned/profiles/cpu-partitioning-powersave
+%{_prefix}/lib/tuned/cpu-partitioning
+%{_prefix}/lib/tuned/cpu-partitioning-powersave
%{_mandir}/man7/tuned-profiles-cpu-partitioning.7*
%files profiles-spectrumscale
-%{_prefix}/lib/tuned/profiles/spectrumscale-ece
+%{_prefix}/lib/tuned/spectrumscale-ece
%{_mandir}/man7/tuned-profiles-spectrumscale-ece.7*
%files profiles-compat
-%{_prefix}/lib/tuned/profiles/default
-%{_prefix}/lib/tuned/profiles/desktop-powersave
-%{_prefix}/lib/tuned/profiles/laptop-ac-powersave
-%{_prefix}/lib/tuned/profiles/server-powersave
-%{_prefix}/lib/tuned/profiles/laptop-battery-powersave
-%{_prefix}/lib/tuned/profiles/enterprise-storage
-%{_prefix}/lib/tuned/profiles/spindown-disk
+%{_prefix}/lib/tuned/default
+%{_prefix}/lib/tuned/desktop-powersave
+%{_prefix}/lib/tuned/laptop-ac-powersave
+%{_prefix}/lib/tuned/server-powersave
+%{_prefix}/lib/tuned/laptop-battery-powersave
+%{_prefix}/lib/tuned/enterprise-storage
+%{_prefix}/lib/tuned/spindown-disk
%{_mandir}/man7/tuned-profiles-compat.7*
%files profiles-postgresql
-%{_prefix}/lib/tuned/profiles/postgresql
+%{_prefix}/lib/tuned/postgresql
%{_mandir}/man7/tuned-profiles-postgresql.7*
%files profiles-openshift
-%{_prefix}/lib/tuned/profiles/openshift
-%{_prefix}/lib/tuned/profiles/openshift-control-plane
-%{_prefix}/lib/tuned/profiles/openshift-node
+%{_prefix}/lib/tuned/openshift
+%{_prefix}/lib/tuned/openshift-control-plane
+%{_prefix}/lib/tuned/openshift-node
%{_mandir}/man7/tuned-profiles-openshift.7*
%files ppd
diff --git a/tuned/consts.py b/tuned/consts.py
index 5134684..76e5a42 100644
--- a/tuned/consts.py
+++ b/tuned/consts.py
@@ -13,7 +13,7 @@ DBUS_INTERFACE = "com.redhat.tuned.control"
DBUS_OBJECT = "/Tuned"
DEFAULT_PROFILE = "balanced"
DEFAULT_STORAGE_FILE = "/run/tuned/save.pickle"
-SYSTEM_PROFILE_DIR = "/usr/lib/tuned/profiles"
+SYSTEM_PROFILE_DIR = "/usr/lib/tuned"
PERSISTENT_STORAGE_DIR = "/var/lib/tuned"
PLUGIN_MAIN_UNIT_NAME = "main"
# Magic section header because ConfigParser does not support "headerless" config
@@ -174,7 +174,7 @@ CFG_FUNC_UNIX_SOCKET_CONNECTIONS_BACKLOG = "getint"
# default rollback strategy
CFG_DEF_ROLLBACK = "auto"
# default profile directories
-CFG_DEF_PROFILE_DIRS = [SYSTEM_PROFILE_DIR, "/etc/tuned/profiles"]
+CFG_DEF_PROFILE_DIRS = [SYSTEM_PROFILE_DIR, "/etc/tuned"]
PATH_CPU_DMA_LATENCY = "/dev/cpu_dma_latency"

@ -34,8 +34,8 @@
Summary: A dynamic adaptive system tuning daemon
Name: tuned
Version: 2.21.0
Release: 1%{?prerel1}%{?dist}
Version: 2.24.0
Release: 2%{?prerel1}%{?dist}
License: GPLv2+
Source0: https://github.com/redhat-performance/%{name}/archive/v%{version}%{?prerel2}/%{name}-%{version}%{?prerel2}.tar.gz
# RHEL-9 specific recommend.conf:
@ -98,6 +98,9 @@ Recommends: subscription-manager
Requires: python3-syspurpose
%endif
%endif
# Revert default profile directory migration only applicable for RHEL-10+
Patch0: tuned-2.24.0-revert-profile-migration.patch
Patch1: 0001-CVE-2024-52336-and-CVE-2024-52337-fixes.patch
%description
The tuned package contains a daemon that tunes system settings dynamically.
@ -256,6 +259,18 @@ Requires: %{name} = %{version}
%description profiles-openshift
Additional TuneD profile(s) optimized for OpenShift.
%package ppd
Summary: PPD compatibility daemon
Requires: %{name} = %{version}
# The compatibility daemon is swappable for power-profiles-daemon
Provides: ppd-service
Conflicts: ppd-service
Conflicts: power-profiles-daemon
%description ppd
An API translation daemon that allows applications to easily transition
to TuneD from power-profiles-daemon (PPD).
%prep
%autosetup -p1 -n %{name}-%{version}%{?prerel2}
@ -272,9 +287,7 @@ make html %{make_python_arg}
%install
make install DESTDIR=%{buildroot} DOCDIR=%{docdir} %{make_python_arg}
%if 0%{?rhel}
sed -i 's/\(dynamic_tuning[ \t]*=[ \t]*\).*/\10/' %{buildroot}%{_sysconfdir}/tuned/tuned-main.conf
%endif
make install-ppd DESTDIR=%{buildroot} DOCDIR=%{docdir} %{make_python_arg}
%if ! 0%{?rhel}
# manual
@ -317,6 +330,10 @@ if [ -r "%{_sysconfdir}/default/grub" ]; then
fi
%post ppd
%systemd_post tuned-ppd.service
%preun
%systemd_preun tuned.service
if [ "$1" == 0 ]; then
@ -327,6 +344,10 @@ if [ "$1" == 0 ]; then
fi
%preun ppd
%systemd_preun tuned-ppd.service
%postun
%systemd_postun_with_restart tuned.service
@ -366,12 +387,24 @@ if [ "$1" == 0 ]; then
fi
%postun ppd
%systemd_postun_with_restart tuned-ppd.service
%triggerun -- tuned < 2.0-0
# remove ktune from old tuned, now part of tuned
/usr/sbin/service ktune stop &>/dev/null || :
/usr/sbin/chkconfig --del ktune &>/dev/null || :
%triggerun ppd -- power-profiles-daemon
# if swapping power-profiles-daemon for tuned-ppd, check whether it is active
if systemctl is-active --quiet power-profiles-daemon; then
mkdir -p %{_localstatedir}/lib/rpm-state/tuned
touch %{_localstatedir}/lib/rpm-state/tuned/ppd-active
fi
%posttrans
# conditional support for grub2, grub2 is not available on all architectures
# and tuned is noarch package, thus the following hack is needed
@ -382,6 +415,15 @@ if [ -d %{_sysconfdir}/grub.d ]; then
fi
%posttrans ppd
# if power-profiles-daemon was active before installing tuned-ppd,
# start tuned-ppd right away
if [ -f %{_localstatedir}/lib/rpm-state/tuned/ppd-active ]; then
systemctl start tuned-ppd
rm -rf %{_localstatedir}/lib/rpm-state/tuned
fi
%files
%exclude %{docdir}/README.utils
%exclude %{docdir}/README.scomes
@ -552,7 +594,103 @@ fi
%{_prefix}/lib/tuned/openshift-node
%{_mandir}/man7/tuned-profiles-openshift.7*
%files ppd
%{_sbindir}/tuned-ppd
%{_unitdir}/tuned-ppd.service
%{_datadir}/dbus-1/system-services/net.hadess.PowerProfiles.service
%{_datadir}/dbus-1/system.d/net.hadess.PowerProfiles.conf
%{_datadir}/polkit-1/actions/net.hadess.PowerProfiles.policy
%config(noreplace) %{_sysconfdir}/tuned/ppd.conf
%changelog
* Mon Nov 18 2024 Jaroslav Škarvada <jskarvad@redhat.com> - 2.24.0-2
- Fixed privileged execution of arbitrary scripts by active local user,
(CVE-2024-52336)
Resolves: RHEL-66639
- Added sanity checks for API methods parameters, (CVE-2024-52337)
Resolves: RHEL-66616
* Wed Aug 7 2024 Jaroslav Škarvada <jskarvad@redhat.com> - 2.24.0-1
- new release
- rebased tuned to latest upstream
related: RHEL-50568
- clear plugin repository when stopping tuning
- man: add description of the balanced-battery profile
* Fri Jul 26 2024 Jaroslav Škarvada <jskarvad@redhat.com> - 2.24.0-0.2.rc1
- fixed functions packaging and added explicit conflict with power-profiles-daemon
related: RHEL-50568
* Thu Jul 25 2024 Jaroslav Škarvada <jskarvad@redhat.com> - 2.24.0-0.1.rc1
- new release
- rebased tuned to latest upstream
resolves: RHEL-50568
- spec: create /etc/tuned/profiles directory
- hotplug: wait for device initialization
- sap-netweaver: increased vm.max_map_count
resolves: RHEL-31757
- daemon: buffer sighup signal
resolves: RHEL-31180
- added an option to configure profile directories
resolves: RHEL-26157
- api: added commands to dynamically create/destroy instances
- functions: added 'intel_recommended_pstate'
- functions: added 'log' which helps with debugging
- functions: added 'package2cpus' and 'packages2uncores' matchers
- functions: added 'lscpu' to list CPU details
- plugins: added plugin_irq
- plugin_video: added support for amdgpu `panel_power_savings` attribute
- plugin_cpu: check that writes are necessary if they may cause redundant IPIs
resolves: RHEL-25613
- plugin_uncore: allow to configure frequency limits using percent
- amd-pstate: added support for controlling core performance boost
- plugin_scheduler: adjusted error logging in _set_affinity
resolves: RHEL-46560
- plugin_audio: enabled controller reset to fix suspend with NVIDIA
- plugin_irq: fixed expansion of variables
- plugin_irqbalance: switched to IRQBALANCE_BANNED_CPULIST
* Thu Feb 22 2024 Jaroslav Škarvada <jskarvad@redhat.com> - 2.22.1-1
- new release
- rebased tuned to latest upstream
related: RHEL-17121
- renamed intel_uncore plugin to uncore
- network-throughput: increased net.ipv4.tcp_rmem default value
resolves: RHEL-25847
* Fri Feb 16 2024 Jaroslav Škarvada <jskarvad@redhat.com> - 2.22.0-1
- new release
- rebased tuned to latest upstream
related: RHEL-17121
* Fri Feb 9 2024 Jaroslav Škarvada <jskarvad@redhat.com> - 2.22.0-0.1.rc1
- new release
- rebased tuned to latest upstream
resolves: RHEL-17121
- print all arguments of failing commands in error messages
resolves: RHEL-3689
- plugin_sysctl: added support for sysctl names with slash
resolves: RHEL-3707
- tuned-adm: added support for moving devices between plugin instances
resolves: RHEL-15141
- api: added methods for retrieval of plugin instances and devices
resolves: RHEL-15137
- plugin_cpu: amd-pstate mentioned instead of just intel_pstate
resolves: RHEL-16469
- hotplug: do not report ENOENT errors on device remove
resolves: RHEL-11342
- plugin_sysctl: expand variables when reporting overrides
resolves: RHEL-18972
- plugin_acpi: new plugin which handles ACPI platform_profile
resolves: RHEL-16966
- plugin_bootloader: skip calling rpm-ostree kargs in no-op case
resolves: RHEL-20767
- plugin_cpu: support cstate settings of pm_qos_resume_latency_us
resolves: RHEL-21129
- scheduler: add option for ignoring IRQs affinity
resolves: RHEL-21923
- plugin_intel_uncore: new plugin for uncore setting
* Tue Aug 29 2023 Jaroslav Škarvada <jskarvad@redhat.com> - 2.21.0-1
- new release
- api: fixed stop method not to require any parameter

Loading…
Cancel
Save