core: do an extra check if oom was triggered when handling sigchild

Should fix #12425.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2019-05-19 15:52:02 +02:00
parent 569554d9e5
commit 2ba6ae6b2b
3 changed files with 8 additions and 2 deletions

View File

@ -2607,7 +2607,7 @@ void unit_add_to_cgroup_empty_queue(Unit *u) {
log_debug_errno(r, "Failed to enable cgroup empty event source: %m");
}
static int unit_check_oom(Unit *u) {
int unit_check_oom(Unit *u) {
_cleanup_free_ char *oom_kill = NULL;
bool increased;
uint64_t c;

View File

@ -197,6 +197,7 @@ int unit_watch_cgroup(Unit *u);
int unit_watch_cgroup_memory(Unit *u);
void unit_add_to_cgroup_empty_queue(Unit *u);
int unit_check_oom(Unit *u);
int unit_attach_pids_to_cgroup(Unit *u, Set *pids, const char *suffix_path);

View File

@ -2524,8 +2524,13 @@ static int manager_dispatch_sigchld(sd_event_source *source, void *userdata) {
/* Finally, execute them all. Note that u1, u2 and the array might contain duplicates, but
* that's fine, manager_invoke_sigchld_event() will ensure we only invoke the handlers once for
* each iteration. */
if (u1)
if (u1) {
/* We check for oom condition, in case we got SIGCHLD before the oom notification.
* We only do this for the cgroup the PID belonged to. */
(void) unit_check_oom(u1);
manager_invoke_sigchld_event(m, u1, &si);
}
if (u2)
manager_invoke_sigchld_event(m, u2, &si);
if (array_copy)