From 4994f15f35c183792afcfc12de91b9074379a09c Mon Sep 17 00:00:00 2001
From: Ivan Shapovalov <intelfx@intelfx.name>
Date: Wed, 7 Aug 2024 10:02:45 +0200
Subject: [PATCH 0848/1160] core/exec-invoke: call setpriority() after
 sched_setattr()

The nice value is part of struct sched_attr, and consequently invoking
sched_setattr() after setpriority() would clobber the nice value with
the default (as we are not setting it in struct sched_attr).

It would be best to combine both calls, but for now simply invoke
setpriority() after sched_setattr() to make sure Nice= remains effective
when used together with CPUSchedulingPolicy=.

(cherry picked from commit 711a157738b3dcd29a5ebc8f498eb46bfac59652)
(cherry picked from commit b628d4dfa61234d28ffaa648ec09c5e9972f832a)
---
 src/core/exec-invoke.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/core/exec-invoke.c b/src/core/exec-invoke.c
index 32373ed0c2..308d332c15 100644
--- a/src/core/exec-invoke.c
+++ b/src/core/exec-invoke.c
@@ -4279,14 +4279,6 @@ int exec_invoke(
                 }
         }
 
-        if (context->nice_set) {
-                r = setpriority_closest(context->nice);
-                if (r < 0) {
-                        *exit_status = EXIT_NICE;
-                        return log_exec_error_errno(context, params, r, "Failed to set up process scheduling priority (nice level): %m");
-                }
-        }
-
         if (context->cpu_sched_set) {
                 struct sched_attr attr = {
                         .size = sizeof(attr),
@@ -4302,6 +4294,14 @@ int exec_invoke(
                 }
         }
 
+        if (context->nice_set) {
+                r = setpriority_closest(context->nice);
+                if (r < 0) {
+                        *exit_status = EXIT_NICE;
+                        return log_exec_error_errno(context, params, r, "Failed to set up process scheduling priority (nice level): %m");
+                }
+        }
+
         if (context->cpu_affinity_from_numa || context->cpu_set.set) {
                 _cleanup_(cpu_set_reset) CPUSet converted_cpu_set = {};
                 const CPUSet *cpu_set;
-- 
2.33.0