conmon: Move OOM setup to helper function
Signed-off-by: Alexander Larsson <alexl@redhat.com>
This commit is contained in:
parent
34b75c20c2
commit
4cb4de6cda
1 changed files with 29 additions and 29 deletions
|
@ -892,6 +892,33 @@ static void setup_terminal_control_fifo()
|
||||||
ninfo("ctlfd: %d", ctlfd);
|
ninfo("ctlfd: %d", ctlfd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setup_oom_handling(int cpid)
|
||||||
|
{
|
||||||
|
/* Setup OOM notification for container process */
|
||||||
|
_cleanup_free_ char *memory_cgroup_path = process_cgroup_subsystem_path(cpid, "memory");
|
||||||
|
if (!memory_cgroup_path) {
|
||||||
|
nexit("Failed to get memory cgroup path");
|
||||||
|
}
|
||||||
|
|
||||||
|
_cleanup_free_ char *memory_cgroup_file_path = g_build_filename(memory_cgroup_path, "cgroup.event_control", NULL);
|
||||||
|
|
||||||
|
if ((cfd = open(memory_cgroup_file_path, O_WRONLY | O_CLOEXEC)) == -1) {
|
||||||
|
nwarn("Failed to open %s", memory_cgroup_file_path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_cleanup_free_ char *memory_cgroup_file_oom_path = g_build_filename(memory_cgroup_path, "memory.oom_control", NULL);
|
||||||
|
if ((ofd = open(memory_cgroup_file_oom_path, O_RDONLY | O_CLOEXEC)) == -1)
|
||||||
|
pexit("Failed to open %s", memory_cgroup_file_oom_path);
|
||||||
|
|
||||||
|
if ((oom_efd = eventfd(0, EFD_CLOEXEC)) == -1)
|
||||||
|
pexit("Failed to create eventfd");
|
||||||
|
|
||||||
|
_cleanup_free_ char *data = g_strdup_printf("%d %d", oom_efd, ofd);
|
||||||
|
if (write_all(cfd, data, strlen(data)) < 0)
|
||||||
|
pexit("Failed to write to cgroup.event_control");
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -918,9 +945,6 @@ int main(int argc, char *argv[])
|
||||||
_cleanup_close_ int dev_null_w = -1;
|
_cleanup_close_ int dev_null_w = -1;
|
||||||
int fds[2];
|
int fds[2];
|
||||||
|
|
||||||
_cleanup_free_ char *memory_cgroup_path = NULL;
|
|
||||||
int wb;
|
|
||||||
|
|
||||||
main_loop = g_main_loop_new (NULL, FALSE);
|
main_loop = g_main_loop_new (NULL, FALSE);
|
||||||
|
|
||||||
/* Command line parameters */
|
/* Command line parameters */
|
||||||
|
@ -1194,31 +1218,7 @@ int main(int argc, char *argv[])
|
||||||
write_sync_fd(sync_pipe_fd, cpid, NULL);
|
write_sync_fd(sync_pipe_fd, cpid, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Setup OOM notification for container process */
|
setup_oom_handling(cpid);
|
||||||
memory_cgroup_path = process_cgroup_subsystem_path(cpid, "memory");
|
|
||||||
if (!memory_cgroup_path) {
|
|
||||||
nexit("Failed to get memory cgroup path");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool oom_handling_enabled = true;
|
|
||||||
_cleanup_free_ char *memory_cgroup_file_path = g_build_filename(memory_cgroup_path, "cgroup.event_control", NULL);
|
|
||||||
if ((cfd = open(memory_cgroup_file_path, O_WRONLY | O_CLOEXEC)) == -1) {
|
|
||||||
nwarn("Failed to open %s", memory_cgroup_file_path);
|
|
||||||
oom_handling_enabled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (oom_handling_enabled) {
|
|
||||||
_cleanup_free_ char *memory_cgroup_file_oom_path = g_build_filename(memory_cgroup_path, "memory.oom_control", NULL);
|
|
||||||
if ((ofd = open(memory_cgroup_file_oom_path, O_RDONLY | O_CLOEXEC)) == -1)
|
|
||||||
pexit("Failed to open %s", memory_cgroup_file_oom_path);
|
|
||||||
|
|
||||||
if ((oom_efd = eventfd(0, EFD_CLOEXEC)) == -1)
|
|
||||||
pexit("Failed to create eventfd");
|
|
||||||
|
|
||||||
wb = snprintf(buf, BUF_SIZE, "%d %d", oom_efd, ofd);
|
|
||||||
if (write_all(cfd, buf, wb) < 0)
|
|
||||||
pexit("Failed to write to cgroup.event_control");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (masterfd_stdout >= 0) {
|
if (masterfd_stdout >= 0) {
|
||||||
g_unix_fd_add (masterfd_stdout, G_IO_IN, stdio_cb, GINT_TO_POINTER(STDOUT_PIPE));
|
g_unix_fd_add (masterfd_stdout, G_IO_IN, stdio_cb, GINT_TO_POINTER(STDOUT_PIPE));
|
||||||
|
@ -1230,7 +1230,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add the OOM event fd to epoll */
|
/* Add the OOM event fd to epoll */
|
||||||
if (oom_handling_enabled) {
|
if (oom_efd >= 0) {
|
||||||
g_unix_fd_add (oom_efd, G_IO_IN, oom_cb, NULL);
|
g_unix_fd_add (oom_efd, G_IO_IN, oom_cb, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue