]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core/cgroup: Apply IODevice*= directives in configured order
authorMichal Koutný <mkoutny@suse.com>
Fri, 13 Sep 2024 17:27:13 +0000 (19:27 +0200)
committerMichal Koutný <mkoutny@suse.com>
Tue, 24 Sep 2024 13:00:41 +0000 (15:00 +0200)
Different device paths may resolve to same device node
(lookup_block_device()), e.g.
        IOReadBandwidthMax=/dev/sda1 18879
        IOReadBandwidthMax=/dev/sda2 18878
where both partitions resolve to /dev/sda and when these values are
applied (they are associated with original paths, i.e. as if applied for
different device) in the order from io_device_limits.

The parsing code prepends, so they end up in reverse order wrt config
file. Switch the direction so that the order of application matches the
order of configuration -- i.e. semantics in all other unit file
directives.

Apply same change to all directives that use per-device lists. (The
question whether partitions should be resolved to base device is
independent.)

And apply the changes equally to DBus properties write handlers.

Fixes #34126

src/core/dbus-cgroup.c
src/core/load-fragment.c

index 49e84b44e3266693cbf9bc67c0f6a0fb40e71eae..459fa6f774c3247a8790e2b3cd48c9f6926917d1 100644 (file)
@@ -1424,7 +1424,7 @@ int bus_cgroup_set_property(
                                         for (type = 0; type < _CGROUP_IO_LIMIT_TYPE_MAX; type++)
                                                 a->limits[type] = cgroup_io_limit_defaults[type];
 
-                                        LIST_PREPEND(device_limits, c->io_device_limits, a);
+                                        LIST_APPEND(device_limits, c->io_device_limits, a);
                                 }
 
                                 a->limits[iol_type] = u64;
@@ -1504,7 +1504,7 @@ int bus_cgroup_set_property(
                                                 free(a);
                                                 return -ENOMEM;
                                         }
-                                        LIST_PREPEND(device_weights, c->io_device_weights, a);
+                                        LIST_APPEND(device_weights, c->io_device_weights, a);
                                 }
 
                                 a->weight = weight;
@@ -1578,7 +1578,7 @@ int bus_cgroup_set_property(
                                                 free(a);
                                                 return -ENOMEM;
                                         }
-                                        LIST_PREPEND(device_latencies, c->io_device_latencies, a);
+                                        LIST_APPEND(device_latencies, c->io_device_latencies, a);
                                 }
 
                                 a->target_usec = target;
@@ -1659,7 +1659,7 @@ int bus_cgroup_set_property(
                                                 return -ENOMEM;
                                         }
 
-                                        LIST_PREPEND(device_bandwidths, c->blockio_device_bandwidths, a);
+                                        LIST_APPEND(device_bandwidths, c->blockio_device_bandwidths, a);
                                 }
 
                                 if (read)
@@ -1753,7 +1753,7 @@ int bus_cgroup_set_property(
                                                 free(a);
                                                 return -ENOMEM;
                                         }
-                                        LIST_PREPEND(device_weights, c->blockio_device_weights, a);
+                                        LIST_APPEND(device_weights, c->blockio_device_weights, a);
                                 }
 
                                 a->weight = weight;
index 7cb8648743cfdbf9104d5273519573c8629195f0..8a94e06265c150259e76a7ea933ebee29b0b1f57 100644 (file)
@@ -4262,7 +4262,7 @@ int config_parse_io_device_weight(
         w->path = TAKE_PTR(resolved);
         w->weight = u;
 
-        LIST_PREPEND(device_weights, c->io_device_weights, w);
+        LIST_APPEND(device_weights, c->io_device_weights, w);
         return 0;
 }
 
@@ -4333,7 +4333,7 @@ int config_parse_io_device_latency(
         l->path = TAKE_PTR(resolved);
         l->target_usec = usec;
 
-        LIST_PREPEND(device_latencies, c->io_device_latencies, l);
+        LIST_APPEND(device_latencies, c->io_device_latencies, l);
         return 0;
 }
 
@@ -4419,7 +4419,7 @@ int config_parse_io_limit(
                 for (CGroupIOLimitType i = 0; i < _CGROUP_IO_LIMIT_TYPE_MAX; i++)
                         l->limits[i] = cgroup_io_limit_defaults[i];
 
-                LIST_PREPEND(device_limits, c->io_device_limits, l);
+                LIST_APPEND(device_limits, c->io_device_limits, l);
         }
 
         l->limits[type] = num;
@@ -4500,7 +4500,7 @@ int config_parse_blockio_device_weight(
         w->path = TAKE_PTR(resolved);
         w->weight = u;
 
-        LIST_PREPEND(device_weights, c->blockio_device_weights, w);
+        LIST_APPEND(device_weights, c->blockio_device_weights, w);
         return 0;
 }
 
@@ -4587,7 +4587,7 @@ int config_parse_blockio_bandwidth(
                 b->rbps = CGROUP_LIMIT_MAX;
                 b->wbps = CGROUP_LIMIT_MAX;
 
-                LIST_PREPEND(device_bandwidths, c->blockio_device_bandwidths, b);
+                LIST_APPEND(device_bandwidths, c->blockio_device_bandwidths, b);
         }
 
         if (read)