Compare commits

...

No commits in common. "c8" and "c9s-tuned-2.28.0-rc.1" have entirely different histories.

16 changed files with 759 additions and 760 deletions

2
.gitignore vendored
View File

@ -1 +1 @@
SOURCES/tuned-2.22.1.tar.gz
/tuned-*.tar.gz

View File

@ -1 +0,0 @@
60e206fe73ea537e64141f92b331f65879766f97 SOURCES/tuned-2.22.1.tar.gz

View File

@ -1,80 +0,0 @@
diff --git a/profiles/cpu-partitioning/script.sh b/profiles/cpu-partitioning/script.sh
index ec422ca..cb378b7 100755
--- a/profiles/cpu-partitioning/script.sh
+++ b/profiles/cpu-partitioning/script.sh
@@ -2,6 +2,38 @@
. /usr/lib/tuned/functions
+no_balance_cpus_file=$STORAGE/no-balance-cpus.txt
+
+change_sd_balance_bit()
+{
+ local set_bit=$1
+ local flags_cur=
+ local file=
+ local cpu=
+
+ for cpu in $(cat $no_balance_cpus_file); do
+ for file in $(find /proc/sys/kernel/sched_domain/cpu$cpu -name flags -print); do
+ flags_cur=$(cat $file)
+ if [ $set_bit -eq 1 ]; then
+ flags_cur=$((flags_cur | 0x1))
+ else
+ flags_cur=$((flags_cur & 0xfffe))
+ fi
+ echo $flags_cur > $file
+ done
+ done
+}
+
+disable_balance_domains()
+{
+ change_sd_balance_bit 0
+}
+
+enable_balance_domains()
+{
+ change_sd_balance_bit 1
+}
+
start() {
mkdir -p "${TUNED_tmpdir}/etc/systemd"
mkdir -p "${TUNED_tmpdir}/usr/lib/dracut/hooks/pre-udev"
@@ -9,6 +41,9 @@ start() {
cp 00-tuned-pre-udev.sh "${TUNED_tmpdir}/usr/lib/dracut/hooks/pre-udev/"
setup_kvm_mod_low_latency
disable_ksm
+
+ echo "$TUNED_no_balance_cores_expanded" | sed 's/,/ /g' > $no_balance_cpus_file
+ disable_balance_domains
return "$?"
}
@@ -18,6 +53,7 @@ stop() {
teardown_kvm_mod_low_latency
enable_ksm
fi
+ enable_balance_domains
return "$?"
}
diff --git a/profiles/cpu-partitioning/tuned.conf b/profiles/cpu-partitioning/tuned.conf
index 11f03cf..a682c9c 100644
--- a/profiles/cpu-partitioning/tuned.conf
+++ b/profiles/cpu-partitioning/tuned.conf
@@ -35,8 +35,6 @@ no_balance_cores_expanded=${f:cpulist_unpack:${no_balance_cores}}
# Fail if isolated_cores contains CPUs which are not online
assert2=${f:assertion:isolated_cores contains online CPU(s):${isolated_cores_expanded}:${isolated_cores_online_expanded}}
-cmd_isolcpus=${f:regex_search_ternary:${no_balance_cores}:\s*[0-9]: isolcpus=${no_balance_cores}:}
-
[sysfs]
/sys/bus/workqueue/devices/writeback/cpumask = ${not_isolated_cpumask}
/sys/devices/virtual/workqueue/cpumask = ${not_isolated_cpumask}
@@ -62,4 +60,4 @@ priority=10
initrd_remove_dir=True
initrd_dst_img=tuned-initrd.img
initrd_add_dir=${tmpdir}
-cmdline_cpu_part=+nohz=on${cmd_isolcpus} nohz_full=${isolated_cores} rcu_nocbs=${isolated_cores} tuned.non_isolcpus=${not_isolated_cpumask} intel_pstate=disable nosoftlockup
+cmdline_cpu_part=+nohz=on nohz_full=${isolated_cores} rcu_nocbs=${isolated_cores} tuned.non_isolcpus=${not_isolated_cpumask} intel_pstate=disable nosoftlockup

View File

@ -1,118 +0,0 @@
diff --git a/tuned/consts.py b/tuned/consts.py
index 3749363..3b41ed9 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 6a59a1d..94e9022 100644
--- a/tuned/daemon/controller.py
+++ b/tuned/daemon/controller.py
@@ -182,6 +182,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)")
@@ -255,8 +257,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], [""]))
@@ -287,7 +289,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]
@@ -300,8 +302,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}")
@@ -314,8 +316,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")
@@ -328,7 +330,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)
@@ -342,6 +344,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:
@@ -388,6 +394,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)
@@ -411,6 +419,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)))
diff --git a/tuned/utils/commands.py b/tuned/utils/commands.py
index ce51fc0..38d95ef 100644
--- a/tuned/utils/commands.py
+++ b/tuned/utils/commands.py
@@ -544,3 +544,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)

View File

@ -1,88 +0,0 @@
diff --git a/profiles/latency-performance/tuned.conf b/profiles/latency-performance/tuned.conf
index 1dec690..e592138 100644
--- a/profiles/latency-performance/tuned.conf
+++ b/profiles/latency-performance/tuned.conf
@@ -35,3 +35,17 @@ vm.dirty_background_ratio=3
# 100 tells the kernel to aggressively swap processes out of physical memory
# and move them to swap cache
vm.swappiness=10
+
+[scheduler]
+runtime=0
+# ktune sysctl settings for rhel6 servers, maximizing i/o throughput
+#
+# Minimal preemption granularity for CPU-bound tasks:
+# (default: 1 msec# (1 + ilog(ncpus)), units: nanoseconds)
+sched_min_granularity_ns = 3000000
+sched_wakeup_granularity_ns = 4000000
+
+# The total time the scheduler will consider a migrated process
+# "cache hot" and thus less likely to be re-migrated
+# (system default is 500000, i.e. 0.5 ms)
+sched_migration_cost_ns = 5000000
diff --git a/profiles/sap-hana/tuned.conf b/profiles/sap-hana/tuned.conf
index aeecf53..1b15ea3 100644
--- a/profiles/sap-hana/tuned.conf
+++ b/profiles/sap-hana/tuned.conf
@@ -20,3 +20,8 @@ kernel.numa_balancing = 0
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10
vm.swappiness = 10
+
+[scheduler]
+runtime=0
+sched_min_granularity_ns = 3000000
+sched_wakeup_granularity_ns = 4000000
diff --git a/profiles/throughput-performance/tuned.conf b/profiles/throughput-performance/tuned.conf
index e4e832f..3d9c42f 100644
--- a/profiles/throughput-performance/tuned.conf
+++ b/profiles/throughput-performance/tuned.conf
@@ -67,9 +67,33 @@ vm.swappiness=10
# on older kernels
net.core.somaxconn=>2048
+[scheduler]
+runtime=0
+# ktune sysctl settings for rhel6 servers, maximizing i/o throughput
+#
+# Minimal preemption granularity for CPU-bound tasks:
+# (default: 1 msec# (1 + ilog(ncpus)), units: nanoseconds)
+sched_min_granularity_ns = 10000000
+
+# SCHED_OTHER wake-up granularity.
+# (default: 1 msec# (1 + ilog(ncpus)), units: nanoseconds)
+#
+# This option delays the preemption effects of decoupled workloads
+# and reduces their over-scheduling. Synchronous workloads will still
+# have immediate wakeup/sleep latencies.
+sched_wakeup_granularity_ns = 15000000
+
# Marvell ThunderX
[sysctl.thunderx]
type=sysctl
uname_regex=aarch64
cpuinfo_regex=${thunderx_cpuinfo_regex}
kernel.numa_balancing=0
+
+# AMD
+[scheduler.amd]
+type=scheduler
+uname_regex=x86_64
+cpuinfo_regex=${amd_cpuinfo_regex}
+runtime=0
+sched_migration_cost_ns=5000000
diff --git a/profiles/virtual-host/tuned.conf b/profiles/virtual-host/tuned.conf
index 5301d9f..24d0fb4 100644
--- a/profiles/virtual-host/tuned.conf
+++ b/profiles/virtual-host/tuned.conf
@@ -14,3 +14,10 @@ vm.dirty_background_ratio = 5
[cpu]
# Setting C3 state sleep mode/power savings
force_latency=cstate.id_no_zero:3|70
+
+[scheduler]
+runtime=0
+# The total time the scheduler will consider a migrated process
+# "cache hot" and thus less likely to be re-migrated
+# (system default is 500000, i.e. 0.5 ms)
+sched_migration_cost_ns = 5000000

View File

@ -1,11 +0,0 @@
diff --git a/profiles/postgresql/tuned.conf b/profiles/postgresql/tuned.conf
index 88da8e4..4fd3810 100644
--- a/profiles/postgresql/tuned.conf
+++ b/profiles/postgresql/tuned.conf
@@ -55,3 +55,6 @@ sched_min_granularity_ns = 10000000
# "cache hot" and thus less likely to be re-migrated
# (system default is 500000, i.e. 0.5 ms)
sched_migration_cost_ns = 50000000
+
+[scheduler.amd]
+enabled=false

View File

@ -1,54 +0,0 @@
From 7557cf975282326cdbfe55b7b803d8075ff37cba Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jaroslav=20=C5=A0karvada?= <jskarvad@redhat.com>
Date: Tue, 12 Mar 2024 20:25:43 +0100
Subject: [PATCH] epyc-eda: added new profile for EDA compute workloads on AMD
EPYC CPUs
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Jaroslav Škarvada <jskarvad@redhat.com>
---
man/tuned-profiles.7 | 4 ++++
profiles/epyc-eda/tuned.conf | 14 ++++++++++++++
2 files changed, 18 insertions(+)
create mode 100644 profiles/epyc-eda/tuned.conf
diff --git a/man/tuned-profiles.7 b/man/tuned-profiles.7
index 10cad7b..600e8bb 100644
--- a/man/tuned-profiles.7
+++ b/man/tuned-profiles.7
@@ -141,6 +141,10 @@ profiles (e.g. throughput\-performance profile), example:
Profile optimized for AWS EC2 instances. It is based on the
throughput\-performance profile.
+.TP
+.BI "epyc-eda"
+Profile optimized for EDA compute workloads on AMD EPYC CPUs.
+
.SH "FILES"
.nf
.I /etc/tuned/*
diff --git a/profiles/epyc-eda/tuned.conf b/profiles/epyc-eda/tuned.conf
new file mode 100644
index 0000000..482d404
--- /dev/null
+++ b/profiles/epyc-eda/tuned.conf
@@ -0,0 +1,14 @@
+#
+# tuned configuration
+#
+
+[main]
+summary=Optimize for EDA compute workloads on AMD EPYC CPUs
+description=Configures virtual memory, CPU governors, and network settings for EDA compute workloads.
+include=throughput-performance
+
+# AMD
+[scheduler.amd]
+type=scheduler
+#Allow processes to rapidly move between cores to avoid idle time and maximize CPU usage
+sched_migration_cost_ns=10000
--
2.44.0

View File

@ -1,28 +0,0 @@
From 04ead944fdf640ed986331179e533542efc934c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jaroslav=20=C5=A0karvada?= <jskarvad@redhat.com>
Date: Mon, 8 Apr 2024 11:03:47 +0200
Subject: [PATCH] sap-netweaver: increased vm.max_map_count
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Resolves: RHEL-31757
Signed-off-by: Jaroslav Škarvada <jskarvad@redhat.com>
---
profiles/sap-netweaver/tuned.conf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/profiles/sap-netweaver/tuned.conf b/profiles/sap-netweaver/tuned.conf
index a1cfd17..81c4d44 100644
--- a/profiles/sap-netweaver/tuned.conf
+++ b/profiles/sap-netweaver/tuned.conf
@@ -10,4 +10,4 @@ include=throughput-performance
kernel.sem = 32000 1024000000 500 32000
kernel.shmall = 18446744073692774399
kernel.shmmax = 18446744073692774399
-vm.max_map_count = 2000000
+vm.max_map_count = 2147483647
--
2.44.0

View File

@ -1,97 +0,0 @@
diff --git a/tuned/plugins/plugin_disk.py b/tuned/plugins/plugin_disk.py
index 1438e35..d6feb06 100644
--- a/tuned/plugins/plugin_disk.py
+++ b/tuned/plugins/plugin_disk.py
@@ -100,19 +100,20 @@ class DiskPlugin(hotplug.Plugin):
self._devices_supported = True
self._use_hdparm = True
self._free_devices = set()
- self._hdparm_apm_devices = set()
+ self._hdparm_apm_device_support = dict()
for device in self._hardware_inventory.get_devices("block"):
if self._device_is_supported(device):
self._free_devices.add(device.sys_name)
- if self._use_hdparm and self._is_hdparm_apm_supported(device.sys_name):
- self._hdparm_apm_devices.add(device.sys_name)
-
self._assigned_devices = set()
def _get_device_objects(self, devices):
return [self._hardware_inventory.get_device("block", x) for x in devices]
def _is_hdparm_apm_supported(self, device):
+ if not self._use_hdparm:
+ return False
+ if device in self._hdparm_apm_device_support:
+ return self._hdparm_apm_device_support[device]
(rc, out, err_msg) = self._cmd.execute(["hdparm", "-C", "/dev/%s" % device], \
no_errors = [errno.ENOENT], return_err=True)
if rc == -errno.ENOENT:
@@ -122,10 +123,13 @@ class DiskPlugin(hotplug.Plugin):
elif rc:
log.info("Device '%s' not supported by hdparm" % device)
log.debug("(rc: %s, msg: '%s')" % (rc, err_msg))
+ self._hdparm_apm_device_support[device] = False
return False
elif "unknown" in out:
log.info("Driver for device '%s' does not support apm command" % device)
+ self._hdparm_apm_device_support[device] = False
return False
+ self._hdparm_apm_device_support[device] = True
return True
@classmethod
@@ -232,7 +236,7 @@ class DiskPlugin(hotplug.Plugin):
return not "standby" in out and not "sleeping" in out
def _instance_update_dynamic(self, instance, device):
- if not device in self._hdparm_apm_devices:
+ if not self._is_hdparm_apm_supported(device):
return
load = instance._load_monitor.get_device_load(device)
if load is None:
@@ -315,7 +319,7 @@ class DiskPlugin(hotplug.Plugin):
# At the moment we support dynamic tuning just for devices compatible with hdparm apm commands
# If in future will be added new functionality not connected to this command,
# it is needed to change it here
- if device not in self._hdparm_apm_devices:
+ if not self._is_hdparm_apm_supported(device):
log.info("There is no dynamic tuning available for device '%s' at time" % device)
else:
super(DiskPlugin, self)._instance_apply_dynamic(instance, device)
@@ -350,7 +354,7 @@ class DiskPlugin(hotplug.Plugin):
@command_set("apm", per_device=True)
def _set_apm(self, value, device, sim, remove):
- if device not in self._hdparm_apm_devices:
+ if not self._is_hdparm_apm_supported(device):
if not sim:
log.info("apm option is not supported for device '%s'" % device)
return None
@@ -366,7 +370,7 @@ class DiskPlugin(hotplug.Plugin):
@command_get("apm")
def _get_apm(self, device, ignore_missing=False):
- if device not in self._hdparm_apm_devices:
+ if not self._is_hdparm_apm_supported(device):
if not ignore_missing:
log.info("apm option is not supported for device '%s'" % device)
return None
@@ -390,7 +394,7 @@ class DiskPlugin(hotplug.Plugin):
@command_set("spindown", per_device=True)
def _set_spindown(self, value, device, sim, remove):
- if device not in self._hdparm_apm_devices:
+ if not self._is_hdparm_apm_supported(device):
if not sim:
log.info("spindown option is not supported for device '%s'" % device)
return None
@@ -406,7 +410,7 @@ class DiskPlugin(hotplug.Plugin):
@command_get("spindown")
def _get_spindown(self, device, ignore_missing=False):
- if device not in self._hdparm_apm_devices:
+ if not self._is_hdparm_apm_supported(device):
if not ignore_missing:
log.info("spindown option is not supported for device '%s'" % device)
return None

7
gating.yaml Normal file
View File

@ -0,0 +1,7 @@
--- !Policy
product_versions:
- rhel-9
decision_context: osci_compose_gate
rules:
- !PassingTestCaseRule {test_case_name: baseos-ci.brew-build.tier1.functional}
- !PassingTestCaseRule {test_case_name: baseos-ci.brew-build.tedude.validation}

1
sources Normal file
View File

@ -0,0 +1 @@
SHA512 (tuned-2.28.0-rc.1.tar.gz) = 9c2d1685464440d10d4765f1f8cc6949255e4f876ea3e5b8315900f3bb71328b78c3eb13ea9b150801d495cddc1f47f9a47eab689081cb5230c31f8172ec6027

View File

@ -0,0 +1,28 @@
diff --git a/profiles/network-throughput/tuned.conf b/profiles/network-throughput/tuned.conf
index eeeb174..e531ac3 100644
--- a/profiles/network-throughput/tuned.conf
+++ b/profiles/network-throughput/tuned.conf
@@ -7,10 +7,6 @@ summary=Optimize for streaming network throughput, generally only necessary on o
include=throughput-performance
[sysctl]
-# Sets tcp_notsent_lowat to a value intended to balance throughput and latency while limiting total socket memory usage.
-net.ipv4.tcp_notsent_lowat=131072
-# Disables slow start after a connection has been idle, allowing immediate maximum throughput upon resuming data transfer.
-net.ipv4.tcp_slow_start_after_idle=0
# Increase kernel buffer size maximums. Currently this seems only necessary at 40Gb speeds.
#
# The buffer tuning values below do not account for any potential hugepage allocation.
diff --git a/profiles/openshift/tuned.conf b/profiles/openshift/tuned.conf
index 28dfb4d..197850c 100644
--- a/profiles/openshift/tuned.conf
+++ b/profiles/openshift/tuned.conf
@@ -4,7 +4,7 @@
[main]
summary=Optimize systems running OpenShift (parent profile)
-include=${f:virt_check:virtual-guest:network-throughput}
+include=${f:virt_check:virtual-guest:throughput-performance}
[selinux]
avc_cache_threshold=8192

View File

@ -0,0 +1,80 @@
diff --git a/doc/manual/meta/variables.adoc b/doc/manual/meta/variables.adoc
index 008ac79..197b003 100644
--- a/doc/manual/meta/variables.adoc
+++ b/doc/manual/meta/variables.adoc
@@ -1,2 +1,2 @@
-:system-profile-dir: /usr/lib/tuned/profiles
-:user-profile-dir: /etc/tuned/profiles
+:system-profile-dir: /usr/lib/tuned
+:user-profile-dir: /etc/tuned
diff --git a/man/tuned-adm.8 b/man/tuned-adm.8
index 432bd20..e5c7bce 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 88d4dbb..e3f9262 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.
@@ -150,8 +150,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/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

View File

@ -0,0 +1,37 @@
diff --git a/doc/TIPS.txt b/doc/TIPS.txt
index 0a0c490..36b4071 100644
--- a/doc/TIPS.txt
+++ b/doc/TIPS.txt
@@ -19,6 +19,8 @@
* Make sure writes to hd don't wake it up too quickly:
** Set flushing to once per 5 minutes
** echo "3000" > /proc/sys/vm/dirty_writeback_centisecs
+** Enable laptop mode
+** echo "5" > /proc/sys/vm/laptop_mode
* Use relatime for your / partition
** mount -o remount,relatime /
* Enable USB autosuspend by adding the following to the kernel boot commandline:
diff --git a/profiles/powersave/tuned.conf b/profiles/powersave/tuned.conf
index c8173af..fe12766 100644
--- a/profiles/powersave/tuned.conf
+++ b/profiles/powersave/tuned.conf
@@ -37,6 +37,7 @@ panel_power_savings=3
alpm=med_power_with_dipm
[sysctl]
+vm.laptop_mode=5
vm.dirty_writeback_centisecs=1500
kernel.nmi_watchdog=0
diff --git a/profiles/spindown-disk/tuned.conf b/profiles/spindown-disk/tuned.conf
index 75b472b..b13dbd9 100644
--- a/profiles/spindown-disk/tuned.conf
+++ b/profiles/spindown-disk/tuned.conf
@@ -32,6 +32,7 @@ dirty_bytes=60%
[sysctl]
vm.dirty_writeback_centisecs=6000
vm.dirty_expire_centisecs=9000
+vm.laptop_mode=5
vm.swappiness=30
[script]

File diff suppressed because it is too large Load Diff