mirror of
https://github.com/systemd/systemd.git
synced 2024-12-25 01:34:28 +03:00
cgroup-util: helper to cg_get_attribute and convert to uint64_t
A common pattern in the codebase is reading a cgroup memory value and converting it to a uint64_t. Let's make it a helper and refactor a few places to use it so it's more concise.
This commit is contained in:
parent
1b43e24602
commit
613328c3e2
@ -1639,6 +1639,32 @@ int cg_get_attribute(const char *controller, const char *path, const char *attri
|
||||
return read_one_line_file(p, ret);
|
||||
}
|
||||
|
||||
int cg_get_attribute_as_uint64(const char *controller, const char *path, const char *attribute, uint64_t *ret) {
|
||||
_cleanup_free_ char *value = NULL;
|
||||
uint64_t v;
|
||||
int r;
|
||||
|
||||
assert(ret);
|
||||
|
||||
r = cg_get_attribute(controller, path, attribute, &value);
|
||||
if (r == -ENOENT)
|
||||
return -ENODATA;
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (streq(value, "max")) {
|
||||
*ret = CGROUP_LIMIT_MAX;
|
||||
return 0;
|
||||
}
|
||||
|
||||
r = safe_atou64(value, &v);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
*ret = v;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cg_get_keyed_attribute(
|
||||
const char *controller,
|
||||
const char *path,
|
||||
|
@ -184,6 +184,8 @@ int cg_set_attribute(const char *controller, const char *path, const char *attri
|
||||
int cg_get_attribute(const char *controller, const char *path, const char *attribute, char **ret);
|
||||
int cg_get_keyed_attribute(const char *controller, const char *path, const char *attribute, char **keys, char **values);
|
||||
|
||||
int cg_get_attribute_as_uint64(const char *controller, const char *path, const char *attribute, uint64_t *ret);
|
||||
|
||||
int cg_set_access(const char *controller, const char *path, uid_t uid, gid_t gid);
|
||||
|
||||
int cg_set_xattr(const char *controller, const char *path, const char *name, const void *value, size_t size, int flags);
|
||||
|
@ -120,16 +120,9 @@ uint64_t system_tasks_max(void) {
|
||||
if (r < 0)
|
||||
log_debug_errno(r, "Failed to determine cgroup root path, ignoring: %m");
|
||||
else {
|
||||
_cleanup_free_ char *value = NULL;
|
||||
|
||||
r = cg_get_attribute("pids", root, "pids.max", &value);
|
||||
r = cg_get_attribute_as_uint64("pids", root, "pids.max", &b);
|
||||
if (r < 0)
|
||||
log_debug_errno(r, "Failed to read pids.max attribute of cgroup root, ignoring: %m");
|
||||
else if (!streq(value, "max")) {
|
||||
r = safe_atou64(value, &b);
|
||||
if (r < 0)
|
||||
log_debug_errno(r, "Failed to parse pids.max attribute of cgroup root, ignoring: %m");
|
||||
}
|
||||
}
|
||||
|
||||
return MIN3(TASKS_MAX,
|
||||
|
@ -215,31 +215,12 @@ void cgroup_context_done(CGroupContext *c) {
|
||||
}
|
||||
|
||||
static int unit_get_kernel_memory_limit(Unit *u, const char *file, uint64_t *ret) {
|
||||
_cleanup_free_ char *raw_kval = NULL;
|
||||
uint64_t kval;
|
||||
int r;
|
||||
|
||||
assert(u);
|
||||
|
||||
if (!u->cgroup_realized)
|
||||
return -EOWNERDEAD;
|
||||
|
||||
r = cg_get_attribute("memory", u->cgroup_path, file, &raw_kval);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (streq(raw_kval, "max")) {
|
||||
*ret = CGROUP_LIMIT_MAX;
|
||||
return 0;
|
||||
}
|
||||
|
||||
r = safe_atou64(raw_kval, &kval);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
*ret = kval;
|
||||
|
||||
return 0;
|
||||
return cg_get_attribute_as_uint64("memory", u->cgroup_path, file, ret);
|
||||
}
|
||||
|
||||
static int unit_compare_memory_limit(Unit *u, const char *property_name, uint64_t *ret_unit_value, uint64_t *ret_kernel_value) {
|
||||
@ -3112,7 +3093,6 @@ int manager_notify_cgroup_empty(Manager *m, const char *cgroup) {
|
||||
}
|
||||
|
||||
int unit_get_memory_current(Unit *u, uint64_t *ret) {
|
||||
_cleanup_free_ char *v = NULL;
|
||||
int r;
|
||||
|
||||
assert(u);
|
||||
@ -3134,22 +3114,11 @@ int unit_get_memory_current(Unit *u, uint64_t *ret) {
|
||||
r = cg_all_unified();
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (r > 0)
|
||||
r = cg_get_attribute("memory", u->cgroup_path, "memory.current", &v);
|
||||
else
|
||||
r = cg_get_attribute("memory", u->cgroup_path, "memory.usage_in_bytes", &v);
|
||||
if (r == -ENOENT)
|
||||
return -ENODATA;
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return safe_atou64(v, ret);
|
||||
return cg_get_attribute_as_uint64("memory", u->cgroup_path, r > 0 ? "memory.current" : "memory.usage_in_bytes", ret);
|
||||
}
|
||||
|
||||
int unit_get_tasks_current(Unit *u, uint64_t *ret) {
|
||||
_cleanup_free_ char *v = NULL;
|
||||
int r;
|
||||
|
||||
assert(u);
|
||||
assert(ret);
|
||||
|
||||
@ -3166,17 +3135,10 @@ int unit_get_tasks_current(Unit *u, uint64_t *ret) {
|
||||
if ((u->cgroup_realized_mask & CGROUP_MASK_PIDS) == 0)
|
||||
return -ENODATA;
|
||||
|
||||
r = cg_get_attribute("pids", u->cgroup_path, "pids.current", &v);
|
||||
if (r == -ENOENT)
|
||||
return -ENODATA;
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return safe_atou64(v, ret);
|
||||
return cg_get_attribute_as_uint64("pids", u->cgroup_path, "pids.current", ret);
|
||||
}
|
||||
|
||||
static int unit_get_cpu_usage_raw(Unit *u, nsec_t *ret) {
|
||||
_cleanup_free_ char *v = NULL;
|
||||
uint64_t ns;
|
||||
int r;
|
||||
|
||||
@ -3212,17 +3174,8 @@ static int unit_get_cpu_usage_raw(Unit *u, nsec_t *ret) {
|
||||
return r;
|
||||
|
||||
ns = us * NSEC_PER_USEC;
|
||||
} else {
|
||||
r = cg_get_attribute("cpuacct", u->cgroup_path, "cpuacct.usage", &v);
|
||||
if (r == -ENOENT)
|
||||
return -ENODATA;
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = safe_atou64(v, &ns);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
} else
|
||||
return cg_get_attribute_as_uint64("cpuacct", u->cgroup_path, "cpuacct.usage", ret);
|
||||
|
||||
*ret = ns;
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user