]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
pid1: order jobs that execute processes with lower priority
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 18 Jul 2019 16:30:15 +0000 (18:30 +0200)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 19 Jul 2019 05:38:52 +0000 (14:38 +0900)
We can meaningfully compare jobs for units which have cpu weight or nice set.
But non-exec units those have those set.

Starting non-exec jobs first allows us to get them out of the queue quickly,
and consider more jobs for starting.

If we have service A, and socket B, and service C which is after socket B,
and we want to start both A and C, and C has higher cpu weight, if we get
B out of the way first, we'll know that we can start both A and C, and we'll
start C first.

Also invert the comparisons using CMP() so they are always done left vs. right,
and negate when returning instead.

Follow-up for da8e178296.

src/core/cgroup.c

index 2ccdf2d6b2afa6d8a2fdfbb9978574a2c32df708..1366d11c0607c87690b3e6f56608e2e7a0740fb5 100644 (file)
@@ -3531,11 +3531,14 @@ int compare_job_priority(const void *a, const void *b) {
         uint64_t weight_x, weight_y;
         int ret;
 
+        if ((ret = CMP(x->unit->type, y->unit->type)) != 0)
+                return -ret;
+
         weight_x = unit_get_cpu_weight(x->unit);
         weight_y = unit_get_cpu_weight(y->unit);
 
-        if ((ret = CMP(weight_y, weight_x)) != 0)
-                return ret;
+        if ((ret = CMP(weight_x, weight_y)) != 0)
+                return -ret;
 
         nice_x = unit_get_nice(x->unit);
         nice_y = unit_get_nice(y->unit);
@@ -3543,9 +3546,6 @@ int compare_job_priority(const void *a, const void *b) {
         if ((ret = CMP(nice_x, nice_y)) != 0)
                 return ret;
 
-        if ((ret = CMP(x->unit->type, y->unit->type)) != 0)
-                return ret;
-
         return strcmp(x->unit->id, y->unit->id);
 }