From 4ee5fe23e8df2485432a6ff3bd0e4830ca136503 Mon Sep 17 00:00:00 2001 From: Odin Ugedal Date: Wed, 29 May 2019 20:19:04 +0200 Subject: [PATCH] Fix cgroup hugetlb size prefix for kB Use the exported list from runc that uses "KB" and not "kB". This issue breaks kubelet on AArch64 (arm 64). var HugePageSizeUnitList = []string{"B", "KB", "MB", "GB", "TB", "PB"} The hugetlb cgroup control files (introduced here in 2012: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=abb8206cb0773) use "KB" and not "kB" (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/hugetlb_cgroup.c?h=v5.0#n349). The behavior in the kernel has not changed since the introduction, and the current code using "kB" will therefore fail on devices with huge pages smaller than 1MiB. This is the case for AArch64. As seen from the code in "mem_fmt" inside hugetlb_cgroup.c, only "KB", "MB" and "GB" are used, so the others may be removed as well. Here is a real world example of the files inside the "/sys/kernel/mm/hugepages/" directory: - "hugepages-64kB" - "hugepages-2048kB" - "hugepages-32768kB" - "hugepages-1048576kB" And the corresponding cgroup files: - "hugetlb.64KB._____" - "hugetlb.2MB._____" - "hugetlb.32MB._____" - "hugetlb.1GB._____" Signed-off-by: Odin Ugedal --- pkg/kubelet/cm/cgroup_manager_linux.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pkg/kubelet/cm/cgroup_manager_linux.go b/pkg/kubelet/cm/cgroup_manager_linux.go index 7797e9b0c20..18c792785cd 100644 --- a/pkg/kubelet/cm/cgroup_manager_linux.go +++ b/pkg/kubelet/cm/cgroup_manager_linux.go @@ -49,10 +49,6 @@ const ( systemdSuffix string = ".slice" ) -// hugePageSizeList is useful for converting to the hugetlb canonical unit -// which is what is expected when interacting with libcontainer -var hugePageSizeList = []string{"B", "kB", "MB", "GB", "TB", "PB"} - var RootCgroupName = CgroupName([]string{}) // NewCgroupName composes a new cgroup name. @@ -388,7 +384,7 @@ func (m *cgroupManagerImpl) toResources(resourceConfig *ResourceConfig) *libcont // for each page size enumerated, set that value pageSizes := sets.NewString() for pageSize, limit := range resourceConfig.HugePageLimit { - sizeString := units.CustomSize("%g%s", float64(pageSize), 1024.0, hugePageSizeList) + sizeString := units.CustomSize("%g%s", float64(pageSize), 1024.0, libcontainercgroups.HugePageSizeUnitList) resources.HugetlbLimit = append(resources.HugetlbLimit, &libcontainerconfigs.HugepageLimit{ Pagesize: sizeString, Limit: uint64(limit),