diff options
author | Wei Wang <wvw@google.com> | 2021-12-13 17:42:08 -0800 |
---|---|---|
committer | Wei Wang <wvw@google.com> | 2021-12-14 10:57:05 -0800 |
commit | cf4b15e61fc7ac1202c645f2daea520048629a82 (patch) | |
tree | 9be816a83996b26617b6af84ec679dd5ff632584 | |
parent | a2c0b86ad006876199a9b97c23958e54de7e869e (diff) |
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: Wei Wang <wvw@google.com>
Change-Id: I8b4396365a7fc2d93e3a22746195585c140eef3c
-rw-r--r-- | libprocessgroup/sched_policy.cpp | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/libprocessgroup/sched_policy.cpp b/libprocessgroup/sched_policy.cpp index 1a4196a4d..169b1d3e0 100644 --- a/libprocessgroup/sched_policy.cpp +++ b/libprocessgroup/sched_policy.cpp @@ -165,27 +165,7 @@ static int getCGroupSubsys(int tid, const char* subsys, std::string& subgroup) { return 0; } -int get_sched_policy(int tid, SchedPolicy* policy) { - if (tid == 0) { - tid = GetThreadId(); - } - - std::string group; - if (schedboost_enabled()) { - if ((getCGroupSubsys(tid, "schedtune", group) < 0) && - (getCGroupSubsys(tid, "cpu", group) < 0)) { - LOG(ERROR) << "Failed to find cpu cgroup for tid " << tid; - return -1; - } - } - 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 +static int get_sched_policy_from_group(const std::string& group, SchedPolicy* policy) { if (group.empty()) { *policy = SP_FOREGROUND; } else if (group == "foreground") { @@ -205,6 +185,35 @@ int get_sched_policy(int tid, SchedPolicy* policy) { return 0; } +int get_sched_policy(int tid, SchedPolicy* policy) { + if (tid == 0) { + tid = GetThreadId(); + } + + std::string group; + if (schedboost_enabled()) { + if ((getCGroupSubsys(tid, "schedtune", group) < 0) && + (getCGroupSubsys(tid, "cpu", group) < 0)) { + 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 (cpusets_enabled() && getCGroupSubsys(tid, "cpuset", group) < 0) { + LOG(ERROR) << "Failed to find cpuset cgroup for tid " << tid; + return -1; + } + return get_sched_policy_from_group(group, policy); +} + #else /* Stubs for non-Android targets. */ |