Merge "init: skip cgroup/task_profiles configuration if cgroups are disabled" am: 537ab23872

Original change: https://android-review.googlesource.com/c/platform/system/core/+/2263261

Change-Id: Id77ccea3ee5823861cd2517dac694fc8d2f6452e
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Nikita Ioffe 2022-10-24 08:08:31 +00:00 committed by Automerger Merge Worker
commit 9bd7375aab
5 changed files with 38 additions and 15 deletions

View file

@ -662,6 +662,10 @@ static Result<void> wait_for_coldboot_done_action(const BuiltinArguments& args)
}
static Result<void> SetupCgroupsAction(const BuiltinArguments&) {
if (!CgroupsAvailable()) {
LOG(INFO) << "Cgroups support in kernel is not enabled";
return {};
}
// Have to create <CGROUPS_RC_DIR> using make_dir function
// for appropriate sepolicy to be set for it
make_dir(android::base::Dirname(CGROUPS_RC_PATH), 0711);

View file

@ -692,24 +692,28 @@ Result<void> Service::Start() {
start_order_ = next_start_order_++;
process_cgroup_empty_ = false;
bool use_memcg = swappiness_ != -1 || soft_limit_in_bytes_ != -1 || limit_in_bytes_ != -1 ||
limit_percent_ != -1 || !limit_property_.empty();
errno = -createProcessGroup(proc_attr_.uid, pid_, use_memcg);
if (errno != 0) {
if (char byte = 0; write((*pipefd)[1], &byte, 1) < 0) {
return ErrnoError() << "sending notification failed";
if (CgroupsAvailable()) {
bool use_memcg = swappiness_ != -1 || soft_limit_in_bytes_ != -1 || limit_in_bytes_ != -1 ||
limit_percent_ != -1 || !limit_property_.empty();
errno = -createProcessGroup(proc_attr_.uid, pid_, use_memcg);
if (errno != 0) {
if (char byte = 0; write((*pipefd)[1], &byte, 1) < 0) {
return ErrnoError() << "sending notification failed";
}
return Error() << "createProcessGroup(" << proc_attr_.uid << ", " << pid_
<< ") failed for service '" << name_ << "'";
}
return Error() << "createProcessGroup(" << proc_attr_.uid << ", " << pid_
<< ") failed for service '" << name_ << "'";
}
// When the blkio controller is mounted in the v1 hierarchy, NormalIoPriority is
// the default (/dev/blkio). When the blkio controller is mounted in the v2 hierarchy, the
// NormalIoPriority profile has to be applied explicitly.
SetProcessProfiles(proc_attr_.uid, pid_, {"NormalIoPriority"});
// When the blkio controller is mounted in the v1 hierarchy, NormalIoPriority is
// the default (/dev/blkio). When the blkio controller is mounted in the v2 hierarchy, the
// NormalIoPriority profile has to be applied explicitly.
SetProcessProfiles(proc_attr_.uid, pid_, {"NormalIoPriority"});
if (use_memcg) {
ConfigureMemcg();
if (use_memcg) {
ConfigureMemcg();
}
} else {
process_cgroup_empty_ = true;
}
if (oom_score_adjust_ != DEFAULT_OOM_SCORE_ADJUST) {

View file

@ -280,6 +280,15 @@ Result<void> SetProcessAttributes(const ProcessAttributes& attr) {
}
Result<void> WritePidToFiles(std::vector<std::string>* files) {
if (files->empty()) {
// No files to write pid to, exit early.
return {};
}
if (!CgroupsAvailable()) {
return Error() << "cgroups are not available";
}
// See if there were "writepid" instructions to write to files under cpuset path.
std::string cpuset_path;
if (CgroupGetControllerPath("cpuset", &cpuset_path)) {

View file

@ -28,6 +28,7 @@ __BEGIN_DECLS
static constexpr const char* CGROUPV2_CONTROLLER_NAME = "cgroup2";
bool CgroupsAvailable();
bool CgroupGetControllerPath(const std::string& cgroup_name, std::string* path);
bool CgroupGetControllerFromPath(const std::string& path, std::string* cgroup_name);
bool CgroupGetAttributePath(const std::string& attr_name, std::string* path);

View file

@ -55,6 +55,11 @@ using namespace std::chrono_literals;
#define PROCESSGROUP_CGROUP_PROCS_FILE "/cgroup.procs"
bool CgroupsAvailable() {
static bool cgroups_available = access("/proc/cgroups", F_OK) == 0;
return cgroups_available;
}
bool CgroupGetControllerPath(const std::string& cgroup_name, std::string* path) {
auto controller = CgroupMap::GetInstance().FindController(cgroup_name);