From a933af2b82ea90a51a2600cf88cfcc5f2fba9804 Mon Sep 17 00:00:00 2001 From: John Kacur Date: Thu, 18 Nov 2021 14:12:23 -0500 Subject: [PATCH 2/2] rt-tests: cyclicdeadline: Fix double mount of cgroups If /sys/fs/cgroup exists and it is type cgroup2, cyclicdeadline mounts it a second time as cgroup. systemd is creating cgroup2 for logins and this can hang the machine and not allow logins. Fix this by: If /sys/fs/cgroup exists, then use it for cyclicdeadline_test. If it exists but the type is not recognized, exit with an error. Do not simply mount it as type cgroup. TODO: If the file doesn't exit but cgroups are supported in the kernel, the file could be created and mounted. Signed-off-by: John Kacur --- src/sched_deadline/cyclicdeadline.c | 39 +++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/src/sched_deadline/cyclicdeadline.c b/src/sched_deadline/cyclicdeadline.c index 4860a40f5e6b..1f9a5df42d4f 100644 --- a/src/sched_deadline/cyclicdeadline.c +++ b/src/sched_deadline/cyclicdeadline.c @@ -358,6 +358,32 @@ static int mounted(const char *path, long magic) #define CGROUP_PATH "/sys/fs/cgroup" #define CPUSET_PATH CGROUP_PATH "/cpuset" +/** + * cgroup_mounted - test if the path /sys/fs/cgroup exists + * and is a supported type + * + * Returns -1 if the path does not exist + * Returns 0 if the path exists but is not a cgroup type + * Returns 1 if the path exists and supports cgroups + */ +static int cgroup_mounted(void) +{ + int ret; + + ret = mounted(CGROUP_PATH, TMPFS_MAGIC); + if (ret == -1) + return -1; /* path doesn't exist */ + if (ret == 1) + return 1; /* tmpfs */ + ret = mounted(CGROUP_PATH, CGROUP_SUPER_MAGIC); + if (ret == 1) + return 1; /* cgroup v1 */ + ret = mounted(CGROUP_PATH, CGROUP2_SUPER_MAGIC); + if (ret == 1) + return 1; + return 0; /* path exists but type is not recognized */ +} + static int open_cpuset(const char *path, const char *name) { char buf[MAXPATH]; @@ -383,14 +409,13 @@ static int mount_cpuset(void) int fd; /* Check if cgroups is already mounted. */ - ret = mounted(CGROUP_PATH, TMPFS_MAGIC); - if (ret < 0) + ret = cgroup_mounted(); + if (ret < 0) /* /sys/fs/cgroup doesn't exist */ return ret; - if (!ret) { - ret = mount("cgroup_root", CGROUP_PATH, "tmpfs", 0, NULL); - if (ret < 0) - return ret; - } + + if (!ret) /* /sys/fs/cgroup exists, but we don't recognize the type */ + return -1; + ret = stat(CPUSET_PATH, &st); if (ret < 0) { ret = mkdir(CPUSET_PATH, 0755); -- 2.31.1