commit
115fae8a07
|
@ -52,10 +52,9 @@ static bool user_match_lookup_parameters(LookupParameters *p, const char *name,
|
|||
}
|
||||
|
||||
static int build_managed_oom_json_array_element(Unit *u, const char *property, JsonVariant **ret_v) {
|
||||
_cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
|
||||
bool use_limit = false;
|
||||
CGroupContext *c;
|
||||
const char *mode;
|
||||
int r;
|
||||
|
||||
assert(u);
|
||||
assert(property);
|
||||
|
@ -74,19 +73,17 @@ static int build_managed_oom_json_array_element(Unit *u, const char *property, J
|
|||
mode = managed_oom_mode_to_string(MANAGED_OOM_AUTO);
|
||||
else if (streq(property, "ManagedOOMSwap"))
|
||||
mode = managed_oom_mode_to_string(c->moom_swap);
|
||||
else if (streq(property, "ManagedOOMMemoryPressure"))
|
||||
else if (streq(property, "ManagedOOMMemoryPressure")) {
|
||||
mode = managed_oom_mode_to_string(c->moom_mem_pressure);
|
||||
else
|
||||
use_limit = true;
|
||||
} else
|
||||
return -EINVAL;
|
||||
|
||||
r = json_build(&v, JSON_BUILD_OBJECT(
|
||||
return json_build(ret_v, JSON_BUILD_OBJECT(
|
||||
JSON_BUILD_PAIR("mode", JSON_BUILD_STRING(mode)),
|
||||
JSON_BUILD_PAIR("path", JSON_BUILD_STRING(u->cgroup_path)),
|
||||
JSON_BUILD_PAIR("property", JSON_BUILD_STRING(property)),
|
||||
JSON_BUILD_PAIR("limit", JSON_BUILD_UNSIGNED(c->moom_mem_pressure_limit))));
|
||||
|
||||
*ret_v = TAKE_PTR(v);
|
||||
return r;
|
||||
JSON_BUILD_PAIR_CONDITION(use_limit, "limit", JSON_BUILD_UNSIGNED(c->moom_mem_pressure_limit))));
|
||||
}
|
||||
|
||||
int manager_varlink_send_managed_oom_update(Unit *u) {
|
||||
|
@ -478,10 +475,8 @@ void manager_varlink_done(Manager *m) {
|
|||
assert(m);
|
||||
|
||||
/* Send the final message if we still have a subscribe request open. */
|
||||
if (m->managed_oom_varlink_request) {
|
||||
(void) varlink_error(m->managed_oom_varlink_request, VARLINK_ERROR_DISCONNECTED, NULL);
|
||||
m->managed_oom_varlink_request = varlink_unref(m->managed_oom_varlink_request);
|
||||
}
|
||||
if (m->managed_oom_varlink_request)
|
||||
m->managed_oom_varlink_request = varlink_close_unref(m->managed_oom_varlink_request);
|
||||
|
||||
m->varlink_server = varlink_server_unref(m->varlink_server);
|
||||
}
|
||||
|
|
|
@ -226,7 +226,7 @@ $1.IPIngressFilterPath, config_parse_ip_filter_bpf_progs, 0,
|
|||
$1.IPEgressFilterPath, config_parse_ip_filter_bpf_progs, 0, offsetof($1, cgroup_context.ip_filters_egress)
|
||||
$1.ManagedOOMSwap, config_parse_managed_oom_mode, 0, offsetof($1, cgroup_context.moom_swap)
|
||||
$1.ManagedOOMMemoryPressure, config_parse_managed_oom_mode, 0, offsetof($1, cgroup_context.moom_mem_pressure)
|
||||
$1.ManagedOOMMemoryPressureLimitPercent,config_parse_managed_oom_mem_pressure_limit,0, offsetof($1, cgroup_context)
|
||||
$1.ManagedOOMMemoryPressureLimitPercent, config_parse_managed_oom_mem_pressure_limit, 0, offsetof($1, cgroup_context.moom_mem_pressure_limit)
|
||||
$1.NetClass, config_parse_warn_compat, DISABLED_LEGACY, 0'
|
||||
)m4_dnl
|
||||
Unit.Description, config_parse_unit_string_printf, 0, offsetof(Unit, description)
|
||||
|
|
|
@ -3824,7 +3824,6 @@ int config_parse_managed_oom_mode(
|
|||
const char *rvalue,
|
||||
void *data,
|
||||
void *userdata) {
|
||||
Unit *u = userdata;
|
||||
ManagedOOMMode *mode = data, m;
|
||||
UnitType t;
|
||||
|
||||
|
@ -3836,7 +3835,7 @@ int config_parse_managed_oom_mode(
|
|||
|
||||
if (isempty(rvalue)) {
|
||||
*mode = MANAGED_OOM_AUTO;
|
||||
goto finish;
|
||||
return 0;
|
||||
}
|
||||
|
||||
m = managed_oom_mode_from_string(rvalue);
|
||||
|
@ -3845,9 +3844,6 @@ int config_parse_managed_oom_mode(
|
|||
return 0;
|
||||
}
|
||||
*mode = m;
|
||||
|
||||
finish:
|
||||
(void) manager_varlink_send_managed_oom_update(u);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3862,8 +3858,7 @@ int config_parse_managed_oom_mem_pressure_limit(
|
|||
const char *rvalue,
|
||||
void *data,
|
||||
void *userdata) {
|
||||
Unit *u = userdata;
|
||||
CGroupContext *c = data;
|
||||
int *limit = data;
|
||||
UnitType t;
|
||||
int r;
|
||||
|
||||
|
@ -3874,8 +3869,8 @@ int config_parse_managed_oom_mem_pressure_limit(
|
|||
return log_syntax(unit, LOG_WARNING, filename, line, 0, "%s= is not supported for this unit type, ignoring.", lvalue);
|
||||
|
||||
if (isempty(rvalue)) {
|
||||
c->moom_mem_pressure_limit = 0;
|
||||
goto finish;
|
||||
*limit = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
r = parse_percent(rvalue);
|
||||
|
@ -3884,12 +3879,7 @@ int config_parse_managed_oom_mem_pressure_limit(
|
|||
return 0;
|
||||
}
|
||||
|
||||
c->moom_mem_pressure_limit = r;
|
||||
|
||||
finish:
|
||||
/* Only update the limit if memory pressure detection is enabled because the information is irrelevant otherwise */
|
||||
if (c->moom_mem_pressure == MANAGED_OOM_KILL)
|
||||
(void) manager_varlink_send_managed_oom_update(u);
|
||||
*limit = r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1684,6 +1684,7 @@ int unit_load(Unit *u) {
|
|||
|
||||
unit_add_to_dbus_queue(unit_follow_merge(u));
|
||||
unit_add_to_gc_queue(u);
|
||||
(void) manager_varlink_send_managed_oom_update(u);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -2630,7 +2631,7 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, UnitNotifyFlag
|
|||
* sets one of the ManagedOOM*= properties to "kill", then later removes it. systemd-oomd needs to
|
||||
* know to stop monitoring when the unit changes from "kill" -> "auto" on daemon-reload, but we don't
|
||||
* have the information on the property. Thus, indiscriminately send an update. */
|
||||
if (UNIT_IS_INACTIVE_OR_FAILED(ns) || ns == UNIT_ACTIVE)
|
||||
if (UNIT_IS_INACTIVE_OR_FAILED(ns) || UNIT_IS_ACTIVE_OR_RELOADING(ns))
|
||||
(void) manager_varlink_send_managed_oom_update(u);
|
||||
}
|
||||
|
||||
|
|
|
@ -170,15 +170,12 @@ static int recursively_get_cgroup_context(Hashmap *new_h, const char *path) {
|
|||
if (r < 0)
|
||||
return (r == -ENOMEM) ? r : 0;
|
||||
|
||||
if (oom_group) {
|
||||
if (oom_group)
|
||||
r = oomd_insert_cgroup_context(NULL, new_h, cg_path);
|
||||
if (r == -ENOMEM)
|
||||
return r;
|
||||
} else {
|
||||
else
|
||||
r = recursively_get_cgroup_context(new_h, cg_path);
|
||||
if (r == -ENOMEM)
|
||||
return r;
|
||||
}
|
||||
} while ((r = cg_read_subgroup(d, &subpath)) > 0);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -39,6 +39,7 @@ static int fork_and_sleep(unsigned sleep_min) {
|
|||
static void test_oomd_cgroup_kill(void) {
|
||||
_cleanup_free_ char *cgroup_root = NULL, *cgroup = NULL;
|
||||
int pid[2];
|
||||
int r;
|
||||
|
||||
if (geteuid() != 0)
|
||||
return (void) log_tests_skipped("not root");
|
||||
|
@ -52,19 +53,20 @@ static void test_oomd_cgroup_kill(void) {
|
|||
* by the test so that pid1 doesn't delete it before we can read the xattrs. */
|
||||
cgroup = path_join(cgroup_root, "oomdkilltest");
|
||||
assert(cgroup);
|
||||
assert_se(cg_create(SYSTEMD_CGROUP_CONTROLLER, cgroup) >= 0);
|
||||
|
||||
/* If we don't have permissions to set xattrs we're likely in a userns or missing capabilities */
|
||||
if (cg_set_xattr(SYSTEMD_CGROUP_CONTROLLER, cgroup, "user.oomd_test", "test", 4, 0) == -EPERM)
|
||||
return (void) log_tests_skipped("no permissions to set user xattrs");
|
||||
r = cg_set_xattr(SYSTEMD_CGROUP_CONTROLLER, cgroup, "user.oomd_test", "test", 4, 0);
|
||||
if (IN_SET(r, -EPERM, -ENOTSUP))
|
||||
return (void) log_tests_skipped("Cannot set user xattrs");
|
||||
|
||||
/* Do this twice to also check the increment behavior on the xattrs */
|
||||
for (int i = 0; i < 2; i++) {
|
||||
_cleanup_free_ char *v = NULL;
|
||||
int r;
|
||||
|
||||
for (int j = 0; j < 2; j++) {
|
||||
pid[j] = fork_and_sleep(5);
|
||||
assert_se(cg_create_and_attach(SYSTEMD_CGROUP_CONTROLLER, cgroup, pid[j]) >= 0);
|
||||
assert_se(cg_attach(SYSTEMD_CGROUP_CONTROLLER, cgroup, pid[j]) >= 0);
|
||||
}
|
||||
|
||||
r = oomd_cgroup_kill(cgroup, false /* recurse */, false /* dry run */);
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
[Unit]
|
||||
Description=Userspace Out-Of-Memory (OOM) Killer
|
||||
Documentation=man:systemd-oomd.service(8)
|
||||
ConditionCapability=CAP_KILL
|
||||
DefaultDependencies=no
|
||||
Before=multi-user.target shutdown.target
|
||||
Conflicts=shutdown.target
|
||||
|
|
Loading…
Reference in a new issue