libprocessgroup: Combine all 3 ActivateControllers implementations into one
Remove this code duplication and use just one interface.
Bug: 349105928
Change-Id: Id8c7186d9665e9087a654f5781b7593b06349160
diff --git a/libprocessgroup/cgroup_map.cpp b/libprocessgroup/cgroup_map.cpp
index 8180ccf..32bef13 100644
--- a/libprocessgroup/cgroup_map.cpp
+++ b/libprocessgroup/cgroup_map.cpp
@@ -194,24 +194,6 @@
return CgroupControllerWrapper(nullptr);
}
-int CgroupMap::ActivateControllers(const std::string& path) const {
- for (const auto& [name, descriptor] : descriptors_) {
- const uint32_t flags = descriptor.controller()->flags();
- const uint32_t max_activation_depth = descriptor.controller()->max_activation_depth();
- const int depth = GetCgroupDepth(descriptor.controller()->path(), path);
-
- if (flags & CGROUPRC_CONTROLLER_FLAG_NEEDS_ACTIVATION && depth < max_activation_depth) {
- std::string str("+");
- str.append(descriptor.controller()->name());
- if (!WriteStringToFile(str, path + "/cgroup.subtree_control")) {
- if (flags & CGROUPRC_CONTROLLER_FLAG_OPTIONAL) {
- PLOG(WARNING) << "Activation of cgroup controller " << str
- << " failed in path " << path;
- } else {
- return -errno;
- }
- }
- }
- }
- return 0;
+bool CgroupMap::ActivateControllers(const std::string& path) const {
+ return ::ActivateControllers(path, descriptors_);
}
diff --git a/libprocessgroup/cgroup_map.h b/libprocessgroup/cgroup_map.h
index 5ad59bd..fb99076 100644
--- a/libprocessgroup/cgroup_map.h
+++ b/libprocessgroup/cgroup_map.h
@@ -58,7 +58,7 @@
static CgroupMap& GetInstance();
CgroupControllerWrapper FindController(const std::string& name) const;
CgroupControllerWrapper FindControllerByPath(const std::string& path) const;
- int ActivateControllers(const std::string& path) const;
+ bool ActivateControllers(const std::string& path) const;
private:
bool loaded_ = false;
diff --git a/libprocessgroup/processgroup.cpp b/libprocessgroup/processgroup.cpp
index 83a2258..d3719ee 100644
--- a/libprocessgroup/processgroup.cpp
+++ b/libprocessgroup/processgroup.cpp
@@ -662,10 +662,9 @@
return -errno;
}
if (activate_controllers) {
- ret = CgroupMap::GetInstance().ActivateControllers(uid_path);
- if (ret) {
- LOG(ERROR) << "Failed to activate controllers in " << uid_path;
- return ret;
+ if (!CgroupMap::GetInstance().ActivateControllers(uid_path)) {
+ PLOG(ERROR) << "Failed to activate controllers in " << uid_path;
+ return -errno;
}
}
diff --git a/libprocessgroup/setup/cgroup_map_write.cpp b/libprocessgroup/setup/cgroup_map_write.cpp
index 8211680..d05bf24 100644
--- a/libprocessgroup/setup/cgroup_map_write.cpp
+++ b/libprocessgroup/setup/cgroup_map_write.cpp
@@ -180,25 +180,7 @@
return false;
}
- if (controller->flags() & CGROUPRC_CONTROLLER_FLAG_NEEDS_ACTIVATION &&
- controller->max_activation_depth() > 0) {
- std::string str = "+";
- str += controller->name();
- std::string path = controller->path();
- path += "/cgroup.subtree_control";
-
- if (!android::base::WriteStringToFile(str, path)) {
- if (IsOptionalController(controller)) {
- PLOG(INFO) << "Failed to activate optional controller " << controller->name()
- << " at " << path;
- return true;
- }
- PLOG(ERROR) << "Failed to activate controller " << controller->name();
- return false;
- }
- }
-
- return true;
+ return ::ActivateControllers(controller->path(), {{controller->name(), descriptor}});
}
static bool MountV1CgroupController(const CgroupDescriptor& descriptor) {
@@ -323,27 +305,7 @@
// Activate all v2 controllers in path so they can be activated in
// children as they are created.
- for (const auto& [name, descriptor] : descriptors) {
- const CgroupController* controller = descriptor.controller();
- std::uint32_t flags = controller->flags();
- std::uint32_t max_activation_depth = controller->max_activation_depth();
- const int depth = GetCgroupDepth(controller->path(), path);
-
- if (controller->version() == 2 && name != CGROUPV2_HIERARCHY_NAME &&
- flags & CGROUPRC_CONTROLLER_FLAG_NEEDS_ACTIVATION && depth < max_activation_depth) {
- std::string str("+");
- str += controller->name();
- if (!android::base::WriteStringToFile(str, path + "/cgroup.subtree_control")) {
- if (flags & CGROUPRC_CONTROLLER_FLAG_OPTIONAL) {
- PLOG(WARNING) << "Activation of cgroup controller " << str << " failed in path "
- << path;
- } else {
- return false;
- }
- }
- }
- }
- return true;
+ return ::ActivateControllers(path, descriptors);
}
bool CgroupSetup() {
diff --git a/libprocessgroup/util/include/processgroup/util.h b/libprocessgroup/util/include/processgroup/util.h
index d592a63..2c7b329 100644
--- a/libprocessgroup/util/include/processgroup/util.h
+++ b/libprocessgroup/util/include/processgroup/util.h
@@ -31,3 +31,5 @@
using CgroupControllerName = std::string;
using CgroupDescriptorMap = std::map<CgroupControllerName, CgroupDescriptor>;
bool ReadDescriptors(CgroupDescriptorMap* descriptors);
+
+bool ActivateControllers(const std::string& path, const CgroupDescriptorMap& descriptors);
diff --git a/libprocessgroup/util/util.cpp b/libprocessgroup/util/util.cpp
index bff4c6f..1401675 100644
--- a/libprocessgroup/util/util.cpp
+++ b/libprocessgroup/util/util.cpp
@@ -250,3 +250,26 @@
return true;
}
+
+bool ActivateControllers(const std::string& path, const CgroupDescriptorMap& descriptors) {
+ for (const auto& [name, descriptor] : descriptors) {
+ const uint32_t flags = descriptor.controller()->flags();
+ const uint32_t max_activation_depth = descriptor.controller()->max_activation_depth();
+ const unsigned int depth = GetCgroupDepth(descriptor.controller()->path(), path);
+
+ if (flags & CGROUPRC_CONTROLLER_FLAG_NEEDS_ACTIVATION && depth < max_activation_depth) {
+ std::string str("+");
+ str.append(descriptor.controller()->name());
+ if (!android::base::WriteStringToFile(str, path + "/cgroup.subtree_control")) {
+ if (flags & CGROUPRC_CONTROLLER_FLAG_OPTIONAL) {
+ PLOG(WARNING) << "Activation of cgroup controller " << str
+ << " failed in path " << path;
+ } else {
+ return false;
+ }
+ }
+ }
+ }
+ return true;
+}
+