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

Commit 2f4e53e6 authored by T.J. Mercier's avatar T.J. Mercier
Browse files

libprocessgroup: Add CgroupGetAttributePathForProcess and CgroupProcs attribute

ActivityManager monitors process forks with cgroup.procs in cgroup v2.
It currently generates its own paths to application cgroups, but v2
cgroup paths are owned by libprocessgroup. Those paths can change based
on build flags, so paths generated outside of libprocessgroup may not
always be correct.

Bug: 382693152
Bug: 381488882
Test: atest FrameworksMockingServicesTests:AppChildProcessTest
Test: atest CtsAppTestCases:ActivityManagerTest
Ignore-AOSP-first: Needed for framework changes which is run out of ag/
Change-Id: I005a114bf2610361098b7303a27dd7456eb469c8
Merged-In: I005a114bf2610361098b7303a27dd7456eb469c8
parent 43263228
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -32,6 +32,8 @@ bool CgroupGetAttributePath(const std::string& attr_name, std::string* path);
// Provides the path for an attribute in a specific process group
// Provides the path for an attribute in a specific process group
// Returns false in case of error, true in case of success
// Returns false in case of error, true in case of success
bool CgroupGetAttributePathForTask(const std::string& attr_name, pid_t tid, std::string* path);
bool CgroupGetAttributePathForTask(const std::string& attr_name, pid_t tid, std::string* path);
bool CgroupGetAttributePathForProcess(std::string_view attr_name, uid_t uid, pid_t pid,
                                      std::string &path);


bool SetTaskProfiles(pid_t tid, const std::vector<std::string>& profiles,
bool SetTaskProfiles(pid_t tid, const std::vector<std::string>& profiles,
                     bool use_fd_cache = false);
                     bool use_fd_cache = false);
+17 −0
Original line number Original line Diff line number Diff line
@@ -154,6 +154,23 @@ bool CgroupGetAttributePathForTask(const std::string& attr_name, pid_t tid, std:
    return true;
    return true;
}
}


bool CgroupGetAttributePathForProcess(std::string_view attr_name, uid_t uid, pid_t pid,
                                      std::string &path) {
    const TaskProfiles& tp = TaskProfiles::GetInstance();
    const IProfileAttribute* attr = tp.GetAttribute(attr_name);

    if (attr == nullptr) {
        return false;
    }

    if (!attr->GetPathForProcess(uid, pid, &path)) {
        LOG(ERROR) << "Failed to find cgroup for uid " << uid << " pid " << pid;
        return false;
    }

    return true;
}

bool UsePerAppMemcg() {
bool UsePerAppMemcg() {
    bool low_ram_device = GetBoolProperty("ro.config.low_ram", false);
    bool low_ram_device = GetBoolProperty("ro.config.low_ram", false);
    return GetBoolProperty("ro.config.per_app_memcg", low_ram_device);
    return GetBoolProperty("ro.config.per_app_memcg", low_ram_device);
+5 −0
Original line number Original line Diff line number Diff line
@@ -81,6 +81,11 @@
      "Name": "FreezerState",
      "Name": "FreezerState",
      "Controller": "freezer",
      "Controller": "freezer",
      "File": "cgroup.freeze"
      "File": "cgroup.freeze"
    },
    {
      "Name": "CgroupProcs",
      "Controller": "cgroup2",
      "File": "cgroup.procs"
    }
    }
  ],
  ],