]> git.ipfire.org Git - pakfire.git/commitdiff
cgroups: Add function to set nice level
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 31 Mar 2021 17:16:16 +0000 (17:16 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 31 Mar 2021 17:16:16 +0000 (17:16 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/cgroup.c
src/libpakfire/include/pakfire/cgroup.h
tests/libpakfire/cgroup.c

index c57e68a58519978ece3d4623cff74c593f60c83c..4a582b549ab6ad41ec1ed27315774bcf7528ce63 100644 (file)
@@ -183,7 +183,7 @@ static FILE* pakfire_cgroup_fopen(Pakfire pakfire,
 static int pakfire_cgroup_fprintf(Pakfire pakfire,
                const char* group, const char* file, const char* format, ...) {
        char buffer[64];
-       size_t length;
+       ssize_t length;
        int r;
        va_list args;
 
@@ -200,6 +200,10 @@ static int pakfire_cgroup_fprintf(Pakfire pakfire,
        // if the operation was successful.
        r = write(fileno(f), buffer, length);
 
+       // Return zero if everything was written correctly
+       if (r == length)
+               r = 0;
+
        fclose(f);
 
        return r;
@@ -490,3 +494,16 @@ int pakfire_cgroup_cpustat(Pakfire pakfire, const char* group,
 
        return 0;
 }
+
+int pakfire_cgroup_set_nice(Pakfire pakfire, const char* group, int level) {
+       DEBUG(pakfire, "Setting nice level of cgroup %s to %d\n", group, level);
+
+       int r = pakfire_cgroup_fprintf(pakfire, group, "cpu.weight.nice", "%d", level);
+       if (r) {
+               ERROR(pakfire, "Could not change nice level of cgroup %s: %s\n",
+                       group, strerror(errno));
+               return r;
+       }
+
+       return 0;
+}
index 3ac6d441822b2ef6d7c995bcf27f173ab82dfce3..df8fb4d2dc50ac9a564f07ddaf9763fd52f0abc2 100644 (file)
@@ -52,6 +52,8 @@ struct pakfire_cgroup_cpustat {
 int pakfire_cgroup_cpustat(Pakfire pakfire, const char* group,
                struct pakfire_cgroup_cpustat* st);
 
+int pakfire_cgroup_set_nice(Pakfire pakfire, const char* group, int level);
+
 #endif
 
 #endif /* PAKFIRE_CGROUP_H */
index 508614a3e4ec752bcf2a06f2f34169e496469477..95df51bbc9d7e51e540a13ac0199797fae64cfb7 100644 (file)
@@ -163,6 +163,23 @@ static int test_cpustat(const struct test* t) {
        );
 }
 
+static int test_nice(const struct test* t) {
+       ASSERT_SUCCESS(
+               pakfire_cgroup_create(t->pakfire, "pakfire/test")
+       );
+
+       // Set nice level
+       ASSERT_SUCCESS(
+               pakfire_cgroup_set_nice(t->pakfire, "pakfire/test", 5)
+       );
+
+       ASSERT_SUCCESS(
+               pakfire_cgroup_destroy(t->pakfire, "pakfire/test")
+       );
+
+       return EXIT_SUCCESS;
+}
+
 static int test_random_name(const struct test* t) {
        char name1[] = "pakfire/execute-XXXXXX";
        char name2[] = "pakfire/execute-XXXXXX";
@@ -182,6 +199,7 @@ int main(int argc, char** argv) {
        testsuite_add_test(test_killall);
        testsuite_add_test(test_cpustat);
        testsuite_add_test(test_random_name);
+       testsuite_add_test(test_nice);
 
        return testsuite_run();
 }