From d032a92c04c31490ff172d511a60a958f021a311 Mon Sep 17 00:00:00 2001 From: Suren Baghdasaryan Date: Tue, 12 Feb 2019 18:20:38 -0800 Subject: [PATCH] Fix cgroup support for recovery mode In recovery mode a separate set of cgroups should be mounted. Add a cgroups.recovery.json file to describe cgroups mounted during recovery. Change cgroups descriptor parset to allow cgroups and cgroups2 sections to be omitted. Bug: 124270406 Test: "adb reboot sideload; adb devices" shows 'sideload' as expected Change-Id: Ic32bd2b4612ec8390064f87d4655d1bd1183d741 Signed-off-by: Suren Baghdasaryan --- libprocessgroup/cgroup_map.cpp | 32 ++++++++++++++++++-------------- rootdir/Android.mk | 10 ++++++++++ rootdir/cgroups.recovery.json | 9 +++++++++ 3 files changed, 37 insertions(+), 14 deletions(-) create mode 100644 rootdir/cgroups.recovery.json diff --git a/libprocessgroup/cgroup_map.cpp b/libprocessgroup/cgroup_map.cpp index cd8ef94a7..d09481181 100644 --- a/libprocessgroup/cgroup_map.cpp +++ b/libprocessgroup/cgroup_map.cpp @@ -126,22 +126,26 @@ static bool ReadDescriptors(std::map* descriptors return false; } - Json::Value cgroups = root["Cgroups"]; - for (Json::Value::ArrayIndex i = 0; i < cgroups.size(); ++i) { - std::string name = cgroups[i]["Controller"].asString(); - descriptors->emplace(std::make_pair( - name, - CgroupDescriptor(1, name, cgroups[i]["Path"].asString(), - std::strtoul(cgroups[i]["Mode"].asString().c_str(), 0, 8), - cgroups[i]["UID"].asString(), cgroups[i]["GID"].asString()))); + if (root.isMember("Cgroups")) { + const Json::Value& cgroups = root["Cgroups"]; + for (Json::Value::ArrayIndex i = 0; i < cgroups.size(); ++i) { + std::string name = cgroups[i]["Controller"].asString(); + descriptors->emplace(std::make_pair( + name, + CgroupDescriptor(1, name, cgroups[i]["Path"].asString(), + std::strtoul(cgroups[i]["Mode"].asString().c_str(), 0, 8), + cgroups[i]["UID"].asString(), cgroups[i]["GID"].asString()))); + } } - Json::Value cgroups2 = root["Cgroups2"]; - descriptors->emplace(std::make_pair( - CGROUPV2_CONTROLLER_NAME, - CgroupDescriptor(2, CGROUPV2_CONTROLLER_NAME, cgroups2["Path"].asString(), - std::strtoul(cgroups2["Mode"].asString().c_str(), 0, 8), - cgroups2["UID"].asString(), cgroups2["GID"].asString()))); + if (root.isMember("Cgroups2")) { + const Json::Value& cgroups2 = root["Cgroups2"]; + descriptors->emplace(std::make_pair( + CGROUPV2_CONTROLLER_NAME, + CgroupDescriptor(2, CGROUPV2_CONTROLLER_NAME, cgroups2["Path"].asString(), + std::strtoul(cgroups2["Mode"].asString().c_str(), 0, 8), + cgroups2["UID"].asString(), cgroups2["GID"].asString()))); + } return true; } diff --git a/rootdir/Android.mk b/rootdir/Android.mk index 123fdd787..b5e5a7125 100644 --- a/rootdir/Android.mk +++ b/rootdir/Android.mk @@ -74,6 +74,16 @@ LOCAL_MODULE_PATH := $(TARGET_OUT_ETC) include $(BUILD_PREBUILT) +####################################### +# cgroups.json for recovery +include $(CLEAR_VARS) +LOCAL_MODULE := cgroups.recovery.json +LOCAL_SRC_FILES := $(LOCAL_MODULE) +LOCAL_MODULE_CLASS := ETC +LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/etc +LOCAL_MODULE_STEM := cgroups.json +include $(BUILD_PREBUILT) + ####################################### # task_profiles.json include $(CLEAR_VARS) diff --git a/rootdir/cgroups.recovery.json b/rootdir/cgroups.recovery.json new file mode 100644 index 000000000..f0bf5fdf1 --- /dev/null +++ b/rootdir/cgroups.recovery.json @@ -0,0 +1,9 @@ +{ + "Cgroups": [ + { + "Controller": "cpuacct", + "Path": "/acct", + "Mode": "0555" + } + ] +}