diff options
Diffstat (limited to 'libprocessgroup/setup/cgroup_map_write.cpp')
-rw-r--r-- | libprocessgroup/setup/cgroup_map_write.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/libprocessgroup/setup/cgroup_map_write.cpp b/libprocessgroup/setup/cgroup_map_write.cpp index aa41acbdc..3121d244b 100644 --- a/libprocessgroup/setup/cgroup_map_write.cpp +++ b/libprocessgroup/setup/cgroup_map_write.cpp @@ -161,6 +161,10 @@ static void MergeCgroupToDescriptors(std::map<std::string, CgroupDescriptor>* de controller_flags |= CGROUPRC_CONTROLLER_FLAG_NEEDS_ACTIVATION; } + if (cgroup["Optional"].isBool() && cgroup["Optional"].asBool()) { + controller_flags |= CGROUPRC_CONTROLLER_FLAG_OPTIONAL; + } + CgroupDescriptor descriptor( cgroups_version, name, path, std::strtoul(cgroup["Mode"].asString().c_str(), 0, 8), cgroup["UID"].asString(), cgroup["GID"].asString(), controller_flags); @@ -267,8 +271,6 @@ static bool SetupCgroup(const CgroupDescriptor& descriptor) { descriptor.gid())) { LOG(ERROR) << "Failed to create directory for " << controller->name() << " cgroup"; result = -1; - } else { - LOG(ERROR) << "restored ownership for " << controller->name() << " cgroup"; } } else { if (!Mkdir(controller->path(), descriptor.mode(), descriptor.uid(), descriptor.gid())) { @@ -310,8 +312,15 @@ static bool SetupCgroup(const CgroupDescriptor& descriptor) { } if (result < 0) { - PLOG(ERROR) << "Failed to mount " << controller->name() << " cgroup"; - return false; + bool optional = controller->flags() & CGROUPRC_CONTROLLER_FLAG_OPTIONAL; + + if (optional && errno == EINVAL) { + // Optional controllers are allowed to fail to mount if kernel does not support them + LOG(INFO) << "Optional " << controller->name() << " cgroup controller is not mounted"; + } else { + PLOG(ERROR) << "Failed to mount " << controller->name() << " cgroup"; + return false; + } } return true; |