···
cfg = config.hardware.block;
escape = lib.strings.escape [ ''"'' ];
udevValue = types.addCheck types.nonEmptyStr (x: builtins.match "[^\n\r]*" x != null) // {
description = "udev rule value";
descriptionClass = "noun";
37
+
concatStringsSep ", " (
39
+
''SUBSYSTEM=="block"''
40
+
''ACTION=="add|change"''
41
+
''TEST=="queue/scheduler"''
43
+
++ optionals (rotational != null) [
44
+
''ATTR{queue/rotational}=="${if rotational then "1" else "0"}"''
46
+
++ optionals (include != null) [
47
+
''KERNEL=="${escape include}"''
49
+
++ optionals (exclude != null) [
50
+
''KERNEL!="${escape exclude}"''
53
+
''ATTR{queue/scheduler}="${escape scheduler}"''
options.hardware.block = {
···
86
+
defaultSchedulerExclude = mkOption {
87
+
type = types.nullOr udevValue;
88
+
default = "loop[0-9]*";
90
+
Device name pattern to exclude from default scheduler assignment
91
+
through {option}`config.hardware.block.defaultScheduler` and
92
+
{option}`config.hardware.block.defaultSchedulerRotational`.
94
+
By default this excludes loop devices which generally do not benefit
95
+
from extra I/O scheduling in addition to the scheduling already
96
+
performed for their backing devices.
98
+
This setting does not affect {option}`config.hardware.block.scheduler`.
type = types.attrsOf udevValue;
···
services.udev.packages = [
(pkgs.writeTextDir "etc/udev/rules.d/98-block-io-scheduler.rules" (
123
-
map (concatStringsSep ", ") (
124
-
optional (cfg.defaultScheduler != null) [
125
-
''SUBSYSTEM=="block"''
126
-
''ACTION=="add|change"''
127
-
''TEST=="queue/scheduler"''
128
-
''ATTR{queue/scheduler}="${escape cfg.defaultScheduler}"''
130
-
++ optional (cfg.defaultSchedulerRotational != null) [
131
-
''SUBSYSTEM=="block"''
132
-
''ACTION=="add|change"''
133
-
''ATTR{queue/rotational}=="1"''
134
-
''TEST=="queue/scheduler"''
135
-
''ATTR{queue/scheduler}="${escape cfg.defaultSchedulerRotational}"''
137
-
++ mapAttrsToList (name: sched: [
138
-
''SUBSYSTEM=="block"''
139
-
''ACTION=="add|change"''
140
-
''KERNEL=="${escape name}"''
141
-
''ATTR{queue/scheduler}="${escape sched}"''
168
+
optional (cfg.defaultScheduler != null) (udevRule {
169
+
exclude = cfg.defaultSchedulerExclude;
170
+
scheduler = cfg.defaultScheduler;
172
+
++ optional (cfg.defaultSchedulerRotational != null) (udevRule {
174
+
exclude = cfg.defaultSchedulerExclude;
175
+
scheduler = cfg.defaultSchedulerRotational;
177
+
++ mapAttrsToList (
178
+
include: scheduler:
180
+
inherit include scheduler;