Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9accb43a authored by Suren Baghdasaryan's avatar Suren Baghdasaryan Committed by Gerrit Code Review
Browse files

Merge "libprocessgroup: Activate controllers in cgroup v2 hierarchy at intermediate levels"

parents 18a9324e 25ad3f9b
Loading
Loading
Loading
Loading
+19 −0
Original line number Original line Diff line number Diff line
@@ -43,6 +43,7 @@
using android::base::GetBoolProperty;
using android::base::GetBoolProperty;
using android::base::StringPrintf;
using android::base::StringPrintf;
using android::base::unique_fd;
using android::base::unique_fd;
using android::base::WriteStringToFile;


static constexpr const char* CGROUP_PROCS_FILE = "/cgroup.procs";
static constexpr const char* CGROUP_PROCS_FILE = "/cgroup.procs";
static constexpr const char* CGROUP_TASKS_FILE = "/tasks";
static constexpr const char* CGROUP_TASKS_FILE = "/tasks";
@@ -202,3 +203,21 @@ CgroupController CgroupMap::FindController(const std::string& name) const {


    return CgroupController(nullptr);
    return CgroupController(nullptr);
}
}

int CgroupMap::ActivateControllers(const std::string& path) const {
    if (__builtin_available(android 30, *)) {
        auto controller_count = ACgroupFile_getControllerCount();
        for (uint32_t i = 0; i < controller_count; ++i) {
            const ACgroupController* controller = ACgroupFile_getController(i);
            if (ACgroupController_getFlags(controller) &
                CGROUPRC_CONTROLLER_FLAG_NEEDS_ACTIVATION) {
                std::string str = std::string("+") + ACgroupController_getName(controller);
                if (!WriteStringToFile(str, path + "/cgroup.subtree_control")) {
                    return -errno;
                }
            }
        }
        return 0;
    }
    return -ENOSYS;
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -62,6 +62,7 @@ class CgroupMap {


    static CgroupMap& GetInstance();
    static CgroupMap& GetInstance();
    CgroupController FindController(const std::string& name) const;
    CgroupController FindController(const std::string& name) const;
    int ActivateControllers(const std::string& path) const;


  private:
  private:
    bool loaded_ = false;
    bool loaded_ = false;
+12 −4
Original line number Original line Diff line number Diff line
@@ -416,13 +416,15 @@ int killProcessGroupOnce(uid_t uid, int initialPid, int signal, int* max_process
    return KillProcessGroup(uid, initialPid, signal, 0 /*retries*/, max_processes);
    return KillProcessGroup(uid, initialPid, signal, 0 /*retries*/, max_processes);
}
}


static int createProcessGroupInternal(uid_t uid, int initialPid, std::string cgroup) {
static int createProcessGroupInternal(uid_t uid, int initialPid, std::string cgroup,
                                      bool activate_controllers) {
    auto uid_path = ConvertUidToPath(cgroup.c_str(), uid);
    auto uid_path = ConvertUidToPath(cgroup.c_str(), uid);


    struct stat cgroup_stat;
    struct stat cgroup_stat;
    mode_t cgroup_mode = 0750;
    mode_t cgroup_mode = 0750;
    gid_t cgroup_uid = AID_SYSTEM;
    gid_t cgroup_uid = AID_SYSTEM;
    uid_t cgroup_gid = AID_SYSTEM;
    uid_t cgroup_gid = AID_SYSTEM;
    int ret = 0;


    if (stat(cgroup.c_str(), &cgroup_stat) == 1) {
    if (stat(cgroup.c_str(), &cgroup_stat) == 1) {
        PLOG(ERROR) << "Failed to get stats for " << cgroup;
        PLOG(ERROR) << "Failed to get stats for " << cgroup;
@@ -436,6 +438,13 @@ static int createProcessGroupInternal(uid_t uid, int initialPid, std::string cgr
        PLOG(ERROR) << "Failed to make and chown " << uid_path;
        PLOG(ERROR) << "Failed to make and chown " << uid_path;
        return -errno;
        return -errno;
    }
    }
    if (activate_controllers) {
        ret = CgroupMap::GetInstance().ActivateControllers(uid_path);
        if (ret) {
            LOG(ERROR) << "Failed to activate controllers in " << uid_path;
            return ret;
        }
    }


    auto uid_pid_path = ConvertUidPidToPath(cgroup.c_str(), uid, initialPid);
    auto uid_pid_path = ConvertUidPidToPath(cgroup.c_str(), uid, initialPid);


@@ -446,7 +455,6 @@ static int createProcessGroupInternal(uid_t uid, int initialPid, std::string cgr


    auto uid_pid_procs_file = uid_pid_path + PROCESSGROUP_CGROUP_PROCS_FILE;
    auto uid_pid_procs_file = uid_pid_path + PROCESSGROUP_CGROUP_PROCS_FILE;


    int ret = 0;
    if (!WriteStringToFile(std::to_string(initialPid), uid_pid_procs_file)) {
    if (!WriteStringToFile(std::to_string(initialPid), uid_pid_procs_file)) {
        ret = -errno;
        ret = -errno;
        PLOG(ERROR) << "Failed to write '" << initialPid << "' to " << uid_pid_procs_file;
        PLOG(ERROR) << "Failed to write '" << initialPid << "' to " << uid_pid_procs_file;
@@ -466,14 +474,14 @@ int createProcessGroup(uid_t uid, int initialPid, bool memControl) {
    if (isMemoryCgroupSupported() && UsePerAppMemcg()) {
    if (isMemoryCgroupSupported() && UsePerAppMemcg()) {
        CgroupGetControllerPath("memory", &cgroup);
        CgroupGetControllerPath("memory", &cgroup);
        cgroup += "/apps";
        cgroup += "/apps";
        int ret = createProcessGroupInternal(uid, initialPid, cgroup);
        int ret = createProcessGroupInternal(uid, initialPid, cgroup, false);
        if (ret != 0) {
        if (ret != 0) {
            return ret;
            return ret;
        }
        }
    }
    }


    CgroupGetControllerPath(CGROUPV2_CONTROLLER_NAME, &cgroup);
    CgroupGetControllerPath(CGROUPV2_CONTROLLER_NAME, &cgroup);
    return createProcessGroupInternal(uid, initialPid, cgroup);
    return createProcessGroupInternal(uid, initialPid, cgroup, true);
}
}


static bool SetProcessGroupValue(int tid, const std::string& attr_name, int64_t value) {
static bool SetProcessGroupValue(int tid, const std::string& attr_name, int64_t value) {