summaryrefslogtreecommitdiff
path: root/src/gc
diff options
context:
space:
mode:
authorTom Deseyn <tom.deseyn@gmail.com>2017-08-21 20:56:32 +0200
committerJan Vorlicek <janvorli@microsoft.com>2017-08-21 20:56:32 +0200
commitfa01b864246bb588e5088be36dbfe3af833b266f (patch)
treefe0a2191ecafa79e113ac92154b04b500475e78d /src/gc
parentfca2b735f4b5193dfbf7f8b5b8d36060d73a9967 (diff)
downloadcoreclr-fa01b864246bb588e5088be36dbfe3af833b266f.tar.gz
coreclr-fa01b864246bb588e5088be36dbfe3af833b266f.tar.bz2
coreclr-fa01b864246bb588e5088be36dbfe3af833b266f.zip
Support docker cgroup limits (#13488)
* Fix cgroup mountinfo parsing The parsing would find the wrong '-' in lines like this: 354 347 0:28 /system.slice/docker-654dd7b6b8bbfe1739ae3309b471e95ccc82b3a3f56b7879f0a811d68b5c4e1d.scope /sys/fs/cgroup/cpuacct,cpu ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,cpuacct,cpu * cgroup: don't append cgroup relative path for reading docker limits
Diffstat (limited to 'src/gc')
-rw-r--r--src/gc/unix/cgroup.cpp92
1 files changed, 39 insertions, 53 deletions
diff --git a/src/gc/unix/cgroup.cpp b/src/gc/unix/cgroup.cpp
index 4721f09f86..992678b634 100644
--- a/src/gc/unix/cgroup.cpp
+++ b/src/gc/unix/cgroup.cpp
@@ -36,8 +36,8 @@ class CGroup
public:
CGroup()
{
- m_memory_cgroup_path = FindMemoryCgroupPath();
- m_cpu_cgroup_path = FindCpuCgroupPath();
+ m_memory_cgroup_path = FindCgroupPath(&IsMemorySubsystem);
+ m_cpu_cgroup_path = FindCgroupPath(&IsCpuSubsystem);
}
~CGroup()
@@ -110,65 +110,45 @@ private:
return strcmp("cpu", strTok) == 0;
}
- static char* FindMemoryCgroupPath(){
- char *memory_cgroup_path = nullptr;
- char *memory_hierarchy_mount = nullptr;
- char *mem_cgroup_path_relative_to_mount = nullptr;
-
- memory_hierarchy_mount = FindHierarchyMount(&IsMemorySubsystem);
- if (memory_hierarchy_mount == nullptr)
- goto done;
-
- mem_cgroup_path_relative_to_mount = FindCGroupPathForSubsystem(&IsMemorySubsystem);
- if (mem_cgroup_path_relative_to_mount == nullptr)
- goto done;
-
- memory_cgroup_path = (char*)malloc(strlen(memory_hierarchy_mount) + strlen(mem_cgroup_path_relative_to_mount) + 1);
- if (memory_cgroup_path == nullptr)
- goto done;
-
- strcpy(memory_cgroup_path, memory_hierarchy_mount);
- strcat(memory_cgroup_path, mem_cgroup_path_relative_to_mount);
-
- done:
- free(memory_hierarchy_mount);
- free(mem_cgroup_path_relative_to_mount);
- return memory_cgroup_path;
- }
-
- static char* FindCpuCgroupPath(){
- char *cpu_cgroup_path = nullptr;
- char *cpu_hierarchy_mount = nullptr;
- char *cpu_cgroup_path_relative_to_mount = nullptr;
+ static char* FindCgroupPath(bool (*is_subsystem)(const char *)){
+ char *cgroup_path = nullptr;
+ char *hierarchy_mount = nullptr;
+ char *hierarchy_root = nullptr;
+ char *cgroup_path_relative_to_mount = nullptr;
- cpu_hierarchy_mount = FindHierarchyMount(&IsCpuSubsystem);
- if (cpu_hierarchy_mount == nullptr)
+ FindHierarchyMount(is_subsystem, &hierarchy_mount, &hierarchy_root);
+ if (hierarchy_mount == nullptr || hierarchy_root == nullptr)
goto done;
- cpu_cgroup_path_relative_to_mount = FindCGroupPathForSubsystem(&IsCpuSubsystem);
- if (cpu_cgroup_path_relative_to_mount == nullptr)
+ cgroup_path_relative_to_mount = FindCGroupPathForSubsystem(is_subsystem);
+ if (cgroup_path_relative_to_mount == nullptr)
goto done;
- cpu_cgroup_path = (char*)malloc(strlen(cpu_hierarchy_mount) + strlen(cpu_cgroup_path_relative_to_mount) + 1);
- if (cpu_cgroup_path == nullptr)
+ cgroup_path = (char*)malloc(strlen(hierarchy_mount) + strlen(cgroup_path_relative_to_mount) + 1);
+ if (cgroup_path == nullptr)
goto done;
- strcpy(cpu_cgroup_path, cpu_hierarchy_mount);
- strcat(cpu_cgroup_path, cpu_cgroup_path_relative_to_mount);
+ strcpy(cgroup_path, hierarchy_mount);
+ // For a host cgroup, we need to append the relative path.
+ // In a docker container, the root and relative path are the same and we don't need to append.
+ if (strcmp(hierarchy_root, cgroup_path_relative_to_mount) != 0)
+ strcat(cgroup_path, cgroup_path_relative_to_mount);
done:
- free(cpu_hierarchy_mount);
- free(cpu_cgroup_path_relative_to_mount);
- return cpu_cgroup_path;
+ free(hierarchy_mount);
+ free(hierarchy_root);
+ free(cgroup_path_relative_to_mount);
+ return cgroup_path;
}
- static char* FindHierarchyMount(bool (*is_subsystem)(const char *))
+ static void FindHierarchyMount(bool (*is_subsystem)(const char *), char** pmountpath, char** pmountroot)
{
char *line = nullptr;
size_t lineLen = 0, maxLineLen = 0;
char *filesystemType = nullptr;
char *options = nullptr;
char *mountpath = nullptr;
+ char *mountroot = nullptr;
FILE *mountinfofile = fopen(PROC_MOUNTINFO_FILENAME, "r");
if (mountinfofile == nullptr)
@@ -189,11 +169,11 @@ private:
maxLineLen = lineLen;
}
- char* separatorChar = strchr(line, '-');
+ char* separatorChar = strstr(line, " - ");
// See man page of proc to get format for /proc/self/mountinfo file
int sscanfRet = sscanf(separatorChar,
- "- %s %*s %s",
+ " - %s %*s %s",
filesystemType,
options);
if (sscanfRet != 2)
@@ -213,16 +193,21 @@ private:
mountpath = (char*)malloc(lineLen+1);
if (mountpath == nullptr)
goto done;
+ mountroot = (char*)malloc(lineLen+1);
+ if (mountroot == nullptr)
+ goto done;
sscanfRet = sscanf(line,
- "%*s %*s %*s %*s %s ",
+ "%*s %*s %*s %s %s ",
+ mountroot,
mountpath);
- if (sscanfRet != 1)
- {
- free(mountpath);
- mountpath = nullptr;
+ if (sscanfRet != 2)
assert(!"Failed to parse mount info file contents with sscanf.");
- }
+
+ // assign the output arguments and clear the locals so we don't free them.
+ *pmountpath = mountpath;
+ *pmountroot = mountroot;
+ mountpath = mountroot = nullptr;
goto done;
}
strTok = strtok_r(nullptr, ",", &context);
@@ -230,12 +215,13 @@ private:
}
}
done:
+ free(mountpath);
+ free(mountroot);
free(filesystemType);
free(options);
free(line);
if (mountinfofile)
fclose(mountinfofile);
- return mountpath;
}
static char* FindCGroupPathForSubsystem(bool (*is_subsystem)(const char *))