summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2017-06-26 17:40:08 +0200
committerSven Eden <yamakuzure@gmx.net>2017-07-25 09:46:53 +0200
commit05c2ba9bc445a75094f8a48e92b79dcedeec3e1a (patch)
tree7ba5919589b28cf0b1ab3df8b4f437012cee3dd0
parent307680c4ba59739090ca3c9bd28e6c31c31ffe7c (diff)
core: make IOSchedulingClass= and IOSchedulingPriority= settable for transient units
This patch is a bit more complex thant I hoped. In particular the single IOScheduling= property exposed on the bus is split up into IOSchedulingClass= and IOSchedulingPriority= (though compat is retained). Otherwise the asymmetry between setting props and getting them is a bit too nasty. Fixes #5613
-rw-r--r--src/basic/process-util.c17
-rw-r--r--src/basic/process-util.h13
2 files changed, 29 insertions, 1 deletions
diff --git a/src/basic/process-util.c b/src/basic/process-util.c
index cb41fbf31..da825a7c3 100644
--- a/src/basic/process-util.c
+++ b/src/basic/process-util.c
@@ -914,6 +914,23 @@ int pid_compare_func(const void *a, const void *b) {
return 0;
}
+int ioprio_parse_priority(const char *s, int *ret) {
+ int i, r;
+
+ assert(s);
+ assert(ret);
+
+ r = safe_atoi(s, &i);
+ if (r < 0)
+ return r;
+
+ if (!ioprio_priority_is_valid(i))
+ return -EINVAL;
+
+ *ret = i;
+ return 0;
+}
+
static const char *const ioprio_class_table[] = {
[IOPRIO_CLASS_NONE] = "none",
[IOPRIO_CLASS_RT] = "realtime",
diff --git a/src/basic/process-util.h b/src/basic/process-util.h
index 33c6637a4..f73d598d8 100644
--- a/src/basic/process-util.h
+++ b/src/basic/process-util.h
@@ -25,10 +25,11 @@
#include <stddef.h>
#include <stdio.h>
#include <string.h>
-#include <sys/types.h>
#include <sys/resource.h>
+#include <sys/types.h>
#include "format-util.h"
+#include "ioprio.h"
#include "macro.h"
#define procfs_file_alloca(pid, field) \
@@ -120,3 +121,13 @@ static inline bool nice_is_valid(int n) {
return n >= PRIO_MIN && n < PRIO_MAX;
}
#endif // 0
+
+static inline bool ioprio_class_is_valid(int i) {
+ return IN_SET(i, IOPRIO_CLASS_NONE, IOPRIO_CLASS_RT, IOPRIO_CLASS_BE, IOPRIO_CLASS_IDLE);
+}
+
+static inline bool ioprio_priority_is_valid(int i) {
+ return i >= 0 && i < IOPRIO_BE_NR;
+}
+
+int ioprio_parse_priority(const char *s, int *ret);