Merge pull request #7284 from poettering/cgroup-delegate-mask
add a concept of delegating cgroups per unit while enabling specific controllers
This commit is contained in:
+21
-8
@@ -2244,10 +2244,10 @@ int cg_trim_everywhere(CGroupMask supported, const char *path, bool delete_root)
|
||||
}
|
||||
|
||||
int cg_mask_to_string(CGroupMask mask, char **ret) {
|
||||
const char *controllers[_CGROUP_CONTROLLER_MAX + 1];
|
||||
_cleanup_free_ char *s = NULL;
|
||||
size_t n = 0, allocated = 0;
|
||||
bool space = false;
|
||||
CGroupController c;
|
||||
int i = 0;
|
||||
char *s;
|
||||
|
||||
assert(ret);
|
||||
|
||||
@@ -2257,19 +2257,32 @@ int cg_mask_to_string(CGroupMask mask, char **ret) {
|
||||
}
|
||||
|
||||
for (c = 0; c < _CGROUP_CONTROLLER_MAX; c++) {
|
||||
const char *k;
|
||||
size_t l;
|
||||
|
||||
if (!(mask & CGROUP_CONTROLLER_TO_MASK(c)))
|
||||
continue;
|
||||
|
||||
controllers[i++] = cgroup_controller_to_string(c);
|
||||
controllers[i] = NULL;
|
||||
k = cgroup_controller_to_string(c);
|
||||
l = strlen(k);
|
||||
|
||||
if (!GREEDY_REALLOC(s, allocated, n + space + l + 1))
|
||||
return -ENOMEM;
|
||||
|
||||
if (space)
|
||||
s[n] = ' ';
|
||||
memcpy(s + n + space, k, l);
|
||||
n += space + l;
|
||||
|
||||
space = true;
|
||||
}
|
||||
|
||||
s = strv_join((char **)controllers, NULL);
|
||||
if (!s)
|
||||
return -ENOMEM;
|
||||
assert(s);
|
||||
|
||||
s[n] = 0;
|
||||
*ret = s;
|
||||
s = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,11 +34,11 @@
|
||||
/* An enum of well known cgroup controllers */
|
||||
typedef enum CGroupController {
|
||||
CGROUP_CONTROLLER_CPU,
|
||||
CGROUP_CONTROLLER_CPUACCT,
|
||||
CGROUP_CONTROLLER_IO,
|
||||
CGROUP_CONTROLLER_BLKIO,
|
||||
CGROUP_CONTROLLER_CPUACCT, /* v1 only */
|
||||
CGROUP_CONTROLLER_IO, /* v2 only */
|
||||
CGROUP_CONTROLLER_BLKIO, /* v1 only */
|
||||
CGROUP_CONTROLLER_MEMORY,
|
||||
CGROUP_CONTROLLER_DEVICES,
|
||||
CGROUP_CONTROLLER_DEVICES, /* v1 only */
|
||||
CGROUP_CONTROLLER_PIDS,
|
||||
_CGROUP_CONTROLLER_MAX,
|
||||
_CGROUP_CONTROLLER_INVALID = -1,
|
||||
|
||||
+1
-3
@@ -1527,9 +1527,7 @@ int mkdtemp_malloc(const char *template, char **ret) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void funlockfilep(FILE **f) {
|
||||
funlockfile(*f);
|
||||
}
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, funlockfile);
|
||||
|
||||
int read_line(FILE *f, size_t limit, char **ret) {
|
||||
_cleanup_free_ char *buffer = NULL;
|
||||
|
||||
+30
-1
@@ -278,6 +278,9 @@ char *strjoin_real(const char *x, ...) {
|
||||
char *strstrip(char *s) {
|
||||
char *e;
|
||||
|
||||
if (!s)
|
||||
return NULL;
|
||||
|
||||
/* Drops trailing whitespace. Modifies the string in
|
||||
* place. Returns pointer to first non-space character */
|
||||
|
||||
@@ -295,7 +298,13 @@ char *strstrip(char *s) {
|
||||
char *delete_chars(char *s, const char *bad) {
|
||||
char *f, *t;
|
||||
|
||||
/* Drops all whitespace, regardless where in the string */
|
||||
/* Drops all specified bad characters, regardless where in the string */
|
||||
|
||||
if (!s)
|
||||
return NULL;
|
||||
|
||||
if (!bad)
|
||||
bad = WHITESPACE;
|
||||
|
||||
for (f = s, t = s; *f; f++) {
|
||||
if (strchr(bad, *f))
|
||||
@@ -309,6 +318,26 @@ char *delete_chars(char *s, const char *bad) {
|
||||
return s;
|
||||
}
|
||||
|
||||
char *delete_trailing_chars(char *s, const char *bad) {
|
||||
char *p, *c = s;
|
||||
|
||||
/* Drops all specified bad characters, at the end of the string */
|
||||
|
||||
if (!s)
|
||||
return NULL;
|
||||
|
||||
if (!bad)
|
||||
bad = WHITESPACE;
|
||||
|
||||
for (p = s; *p; p++)
|
||||
if (!strchr(bad, *p))
|
||||
c = p + 1;
|
||||
|
||||
*c = 0;
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
char *truncate_nl(char *s) {
|
||||
assert(s);
|
||||
|
||||
|
||||
@@ -133,8 +133,20 @@ char *strjoin_real(const char *x, ...) _sentinel_;
|
||||
|
||||
char *strstrip(char *s);
|
||||
char *delete_chars(char *s, const char *bad);
|
||||
char *delete_trailing_chars(char *s, const char *bad);
|
||||
char *truncate_nl(char *s);
|
||||
|
||||
static inline char *skip_leading_chars(const char *s, const char *bad) {
|
||||
|
||||
if (!s)
|
||||
return NULL;
|
||||
|
||||
if (!bad)
|
||||
bad = WHITESPACE;
|
||||
|
||||
return (char*) s + strspn(s, bad);
|
||||
}
|
||||
|
||||
char ascii_tolower(char x);
|
||||
char *ascii_strlower(char *s);
|
||||
char *ascii_strlower_n(char *s, size_t n);
|
||||
|
||||
@@ -382,19 +382,14 @@ int unit_name_path_escape(const char *f, char **ret) {
|
||||
if (STR_IN_SET(p, "/", ""))
|
||||
s = strdup("-");
|
||||
else {
|
||||
char *e;
|
||||
|
||||
if (!path_is_safe(p))
|
||||
return -EINVAL;
|
||||
|
||||
/* Truncate trailing slashes */
|
||||
e = endswith(p, "/");
|
||||
if (e)
|
||||
*e = 0;
|
||||
delete_trailing_chars(p, "/");
|
||||
|
||||
/* Truncate leading slashes */
|
||||
if (p[0] == '/')
|
||||
p++;
|
||||
p = skip_leading_chars(p, "/");
|
||||
|
||||
s = unit_name_escape(p);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user