From 187dc94d2588a23ceade3a8c3341a6e93928ef68 Mon Sep 17 00:00:00 2001 From: MSVSphere Packaging Team Date: Wed, 27 Nov 2024 03:20:54 +0300 Subject: [PATCH] import tuned-2.24.0-2.el9_5 --- .gitignore | 2 +- .tuned.metadata | 2 +- ...-2024-52336-and-CVE-2024-52337-fixes.patch | 281 ++++++++++ ...uned-2.24.0-revert-profile-migration.patch | 508 ++++++++++++++++++ SPECS/tuned.spec | 148 ++++- 5 files changed, 934 insertions(+), 7 deletions(-) create mode 100644 SOURCES/0001-CVE-2024-52336-and-CVE-2024-52337-fixes.patch create mode 100644 SOURCES/tuned-2.24.0-revert-profile-migration.patch diff --git a/.gitignore b/.gitignore index a30bf5b..a7c1639 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/tuned-2.21.0.tar.gz +SOURCES/tuned-2.24.0.tar.gz diff --git a/.tuned.metadata b/.tuned.metadata index 8a29916..2018d90 100644 --- a/.tuned.metadata +++ b/.tuned.metadata @@ -1 +1 @@ -586db5263ea7dabcc57e24aceb249d397d7d0239 SOURCES/tuned-2.21.0.tar.gz +15e516facaececaa788c2decae4bcd9f46781ffc SOURCES/tuned-2.24.0.tar.gz diff --git a/SOURCES/0001-CVE-2024-52336-and-CVE-2024-52337-fixes.patch b/SOURCES/0001-CVE-2024-52336-and-CVE-2024-52337-fixes.patch new file mode 100644 index 0000000..b10576f --- /dev/null +++ b/SOURCES/0001-CVE-2024-52336-and-CVE-2024-52337-fixes.patch @@ -0,0 +1,281 @@ +From 83928aaa29ff281734a12f225a3ea9acd0af96bb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jaroslav=20=C5=A0karvada?= +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 +--- + 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 @@ + + auth_admin + auth_admin +- yes ++ auth_admin + + + +@@ -103,7 +103,7 @@ + + auth_admin + auth_admin +- yes ++ auth_admin + + + +@@ -113,7 +113,7 @@ + + auth_admin + auth_admin +- yes ++ auth_admin + + + +@@ -123,7 +123,7 @@ + + auth_admin + auth_admin +- yes ++ auth_admin + + + +@@ -223,7 +223,7 @@ + + auth_admin + auth_admin +- yes ++ auth_admin + + + +@@ -253,7 +253,7 @@ + + auth_admin + auth_admin +- yes ++ auth_admin + + + +@@ -263,7 +263,7 @@ + + auth_admin + auth_admin +- yes ++ auth_admin + + + +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 + diff --git a/SOURCES/tuned-2.24.0-revert-profile-migration.patch b/SOURCES/tuned-2.24.0-revert-profile-migration.patch new file mode 100644 index 0000000..4d60699 --- /dev/null +++ b/SOURCES/tuned-2.24.0-revert-profile-migration.patch @@ -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//tuned.conf or in +-/usr/lib/tuned/profiles//tuned.conf file where the /etc/tuned/profiles/ directory has ++The profile definition is stored in /etc/tuned//tuned.conf or in ++/usr/lib/tuned//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" + diff --git a/SPECS/tuned.spec b/SPECS/tuned.spec index d795375..e561b63 100644 --- a/SPECS/tuned.spec +++ b/SPECS/tuned.spec @@ -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 - 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 - 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 - 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 - 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 - 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 - 2.22.0-1 +- new release + - rebased tuned to latest upstream + related: RHEL-17121 + +* Fri Feb 9 2024 Jaroslav Škarvada - 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 - 2.21.0-1 - new release - api: fixed stop method not to require any parameter