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

Commit cf4b15e6 authored by Wei Wang's avatar Wei Wang
Browse files

libprocessgroup: fall back to cpuset in get_sched_policy



Since vendor has a way to override the group cpu/schedtune setup, we
cannot assume the group will always return valid data. This CL let
get_sched_policy to fallback to cpuset if no valid data found in
cpu/schedtune cgroup. In longer term, we should find a way to cache the
group or app's process state in framework other than relying on reading
cgroup back.

Test: /data/nativetest64/libcutils_test/libcutils_test
Bug: 210066228
Signed-off-by: default avatarWei Wang <wvw@google.com>
Change-Id: I8b4396365a7fc2d93e3a22746195585c140eef3c
parent a2c0b86a
Loading
Loading
Loading
Loading
+30 −21
Original line number Diff line number Diff line
@@ -165,6 +165,26 @@ static int getCGroupSubsys(int tid, const char* subsys, std::string& subgroup) {
    return 0;
}

static int get_sched_policy_from_group(const std::string& group, SchedPolicy* policy) {
    if (group.empty()) {
        *policy = SP_FOREGROUND;
    } else if (group == "foreground") {
        *policy = SP_FOREGROUND;
    } else if (group == "system-background") {
        *policy = SP_SYSTEM;
    } else if (group == "background") {
        *policy = SP_BACKGROUND;
    } else if (group == "top-app") {
        *policy = SP_TOP_APP;
    } else if (group == "restricted") {
        *policy = SP_RESTRICTED;
    } else {
        errno = ERANGE;
        return -1;
    }
    return 0;
}

int get_sched_policy(int tid, SchedPolicy* policy) {
    if (tid == 0) {
        tid = GetThreadId();
@@ -177,32 +197,21 @@ int get_sched_policy(int tid, SchedPolicy* policy) {
            LOG(ERROR) << "Failed to find cpu cgroup for tid " << tid;
            return -1;
        }
        // Wipe invalid group to fallback to cpuset
        if (!group.empty()) {
            if (get_sched_policy_from_group(group, policy) < 0) {
                group.clear();
            } else {
                return 0;
            }
    if (group.empty() && cpusets_enabled()) {
        if (getCGroupSubsys(tid, "cpuset", group) < 0) {
            LOG(ERROR) << "Failed to find cpuset cgroup for tid " << tid;
            return -1;
        }
    }

    // TODO: replace hardcoded directories
    if (group.empty()) {
        *policy = SP_FOREGROUND;
    } else if (group == "foreground") {
        *policy = SP_FOREGROUND;
    } else if (group == "system-background") {
        *policy = SP_SYSTEM;
    } else if (group == "background") {
        *policy = SP_BACKGROUND;
    } else if (group == "top-app") {
        *policy = SP_TOP_APP;
    } else if (group == "restricted") {
        *policy = SP_RESTRICTED;
    } else {
        errno = ERANGE;
    if (cpusets_enabled() && getCGroupSubsys(tid, "cpuset", group) < 0) {
        LOG(ERROR) << "Failed to find cpuset cgroup for tid " << tid;
        return -1;
    }
    return 0;
    return get_sched_policy_from_group(group, policy);
}

#else