From 85dabba53dd65bcf6a5d2df21a19ef9b3fc3ed59 Mon Sep 17 00:00:00 2001 From: Matthias FRANCK Date: Wed, 23 Mar 2022 13:42:48 +0100 Subject: [PATCH] prplOS: procd: LCM: Add patch to fix cgroups mount Properly mount cgroups in a root tmpfs where every controller is mounted in a seperate subdirectory, recommended by the kernel documentation of cgroupsv1. Signed-off-by: Matthias FRANCK (cherry picked from commit af84ad24a6acd355ec39c8355eccb02e47b3bec6) --- ...initd-cgroups-mount-legacy-hierarchy.patch | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 package/system/procd/patches/000-initd-cgroups-mount-legacy-hierarchy.patch diff --git a/package/system/procd/patches/000-initd-cgroups-mount-legacy-hierarchy.patch b/package/system/procd/patches/000-initd-cgroups-mount-legacy-hierarchy.patch new file mode 100644 index 0000000000..9a14e5c904 --- /dev/null +++ b/package/system/procd/patches/000-initd-cgroups-mount-legacy-hierarchy.patch @@ -0,0 +1,61 @@ +--- a/initd/early.c ++++ b/initd/early.c +@@ -27,6 +27,9 @@ + #include "../libc-compat.h" + #include "../container.h" + ++#define PATH_CGROUP "/sys/fs/cgroup" ++#define PATH_PROC_CGROUPS "/proc/cgroups" ++ + static void + early_dev(void) + { +@@ -53,6 +56,37 @@ early_console(const char *dev) + } + + static void ++mount_cgroup_controllers(void){ ++ char cgroups_line[256] = {0}; ++ // Getting supported cgroup controllers from the kernel ++ FILE *filp_cgroups = fopen(PATH_PROC_CGROUPS, "r"); ++ if(! filp_cgroups ){ ++ ERROR("Failed to open " PATH_PROC_CGROUPS); ++ return; ++ } ++ while( fgets(cgroups_line, 256, filp_cgroups) ){ ++ char *space; ++ char fullpath[256] = {0}; ++ if(cgroups_line[0] == '#') continue; ++ space = strchr(cgroups_line, '\t'); ++ if(! space) continue; ++ *space = '\0'; ++ ++ if( snprintf(fullpath, 255, PATH_CGROUP "/%s", cgroups_line) < 1){ ++ ERROR("Cannot make controller path: %s\n", cgroups_line); ++ continue; ++ } ++ if( mkdir(fullpath, 0777) ){ ++ ERROR("Cannot create controller path: %s\n", fullpath); ++ continue; ++ } ++ mount(cgroups_line, fullpath, "cgroup", MS_NOATIME | MS_NODEV | MS_NOEXEC | MS_NOSUID, cgroups_line); ++ LOG("Mounted %s\n", fullpath); ++ } ++ fclose(filp_cgroups); ++} ++ ++static void + early_mounts(void) + { + unsigned int oldumask = umask(0); +@@ -60,7 +94,9 @@ early_mounts(void) + if (!is_container()) { + mount("proc", "/proc", "proc", MS_NOATIME | MS_NODEV | MS_NOEXEC | MS_NOSUID, 0); + mount("sysfs", "/sys", "sysfs", MS_NOATIME | MS_NODEV | MS_NOEXEC | MS_NOSUID, 0); +- mount("cgroup2", "/sys/fs/cgroup", "cgroup2", MS_NODEV | MS_NOEXEC | MS_NOSUID | MS_RELATIME, "nsdelegate"); ++ LOG("Attempting to mount cgroups (tmpfs + controller subdirs)\n"); ++ mount("cgroup2", PATH_CGROUP, "tmpfs", MS_NODEV | MS_NOEXEC | MS_NOSUID, "size=512K"); ++ mount_cgroup_controllers(); + mount("tmpfs", "/dev", "tmpfs", MS_NOATIME | MS_NOEXEC | MS_NOSUID, "mode=0755,size=512K"); + ignore(symlink("/tmp/shm", "/dev/shm")); + mkdir("/dev/pts", 0755);