summaryrefslogtreecommitdiff
path: root/src/pal/src/misc
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/pal/src/misc
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/pal/src/misc')
-rw-r--r--src/pal/src/misc/cgroup.cpp99
1 files changed, 41 insertions, 58 deletions
diff --git a/src/pal/src/misc/cgroup.cpp b/src/pal/src/misc/cgroup.cpp
index 46d83842de..ec0a0bd5fb 100644
--- a/src/pal/src/misc/cgroup.cpp
+++ b/src/pal/src/misc/cgroup.cpp
@@ -31,8 +31,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()
@@ -105,71 +105,48 @@ 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;
- size_t len;
-
- 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;
-
- len = strlen(memory_hierarchy_mount);
- len += strlen(mem_cgroup_path_relative_to_mount);
- memory_cgroup_path = (char*)PAL_malloc(len+1);
- if (memory_cgroup_path == nullptr)
- goto done;
-
- strcpy_s(memory_cgroup_path, len+1, memory_hierarchy_mount);
- strcat_s(memory_cgroup_path, len+1, mem_cgroup_path_relative_to_mount);
-
- done:
- PAL_free(memory_hierarchy_mount);
- PAL_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;
size_t len;
- 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;
- len = strlen(cpu_hierarchy_mount);
- len += strlen(cpu_cgroup_path_relative_to_mount);
- cpu_cgroup_path = (char*)PAL_malloc(len+1);
- if (cpu_cgroup_path == nullptr)
+ len = strlen(hierarchy_mount);
+ len += strlen(cgroup_path_relative_to_mount);
+ cgroup_path = (char*)PAL_malloc(len+1);
+ if (cgroup_path == nullptr)
goto done;
- strcpy_s(cpu_cgroup_path, len+1, cpu_hierarchy_mount);
- strcat_s(cpu_cgroup_path, len+1, cpu_cgroup_path_relative_to_mount);
+ strcpy_s(cgroup_path, len+1, 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_s(cgroup_path, len+1, cgroup_path_relative_to_mount);
done:
- PAL_free(cpu_hierarchy_mount);
- PAL_free(cpu_cgroup_path_relative_to_mount);
- return cpu_cgroup_path;
+ PAL_free(hierarchy_mount);
+ PAL_free(hierarchy_root);
+ PAL_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 +166,11 @@ private:
goto done;
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_s(separatorChar,
- "- %s %*s %s",
+ " - %s %*s %s",
filesystemType, lineLen+1,
options, lineLen+1);
if (sscanfRet != 2)
@@ -213,16 +190,21 @@ private:
mountpath = (char*)PAL_malloc(lineLen+1);
if (mountpath == nullptr)
goto done;
+ mountroot = (char*)PAL_malloc(lineLen+1);
+ if (mountroot == nullptr)
+ goto done;
sscanfRet = sscanf_s(line,
- "%*s %*s %*s %*s %s ",
+ "%*s %*s %*s %s %s ",
+ mountroot, lineLen+1,
mountpath, lineLen+1);
- if (sscanfRet != 1)
- {
- PAL_free(mountpath);
- mountpath = nullptr;
+ if (sscanfRet != 2)
_ASSERTE(!"Failed to parse mount info file contents with sscanf_s.");
- }
+
+ // 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_s(nullptr, ",", &context);
@@ -230,12 +212,13 @@ private:
}
}
done:
+ PAL_free(mountpath);
+ PAL_free(mountroot);
PAL_free(filesystemType);
PAL_free(options);
free(line);
if (mountinfofile)
fclose(mountinfofile);
- return mountpath;
}
static char* FindCGroupPathForSubsystem(bool (*is_subsystem)(const char *))