From bc7b6df7dc363404df21b062a016aa19923b24de Mon Sep 17 00:00:00 2001 From: Jing Ji Date: Thu, 28 Jan 2021 00:42:19 -0800 Subject: [PATCH] Adapt the cgroup v2 in PhantomProcessList Bug: 178675122 Test: atest AppChildProcessTest Test: atest CtsAppTestCases:ActivityManagerTest Change-Id: Ifad53ae06bc77da97ffae580d0078a006b4159b7 --- .../android/server/am/PhantomProcessList.java | 27 +++++++++++++++++-- .../server/am/AppChildProcessTest.java | 2 +- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/am/PhantomProcessList.java b/services/core/java/com/android/server/am/PhantomProcessList.java index 5167c57199551..37b17411dac58 100644 --- a/services/core/java/com/android/server/am/PhantomProcessList.java +++ b/services/core/java/com/android/server/am/PhantomProcessList.java @@ -38,6 +38,7 @@ import com.android.internal.os.ProcessCpuTracker; import libcore.io.IoUtils; +import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -109,10 +110,23 @@ public final class PhantomProcessList { private final ActivityManagerService mService; private final Handler mKillHandler; + private static final int CGROUP_V1 = 0; + private static final int CGROUP_V2 = 1; + private static final String[] CGROUP_PATH_PREFIXES = { + "/acct/uid_" /* cgroup v1 */, + "/sys/fs/cgroup/uid_" /* cgroup v2 */ + }; + private static final String CGROUP_PID_PREFIX = "/pid_"; + private static final String CGROUP_PROCS = "/cgroup.procs"; + + @VisibleForTesting + int mCgroupVersion = CGROUP_V1; + PhantomProcessList(final ActivityManagerService service) { mService = service; mKillHandler = service.mProcessList.sKillHandler; mInjector = new Injector(); + probeCgroupVersion(); } @VisibleForTesting @@ -190,9 +204,18 @@ public final class PhantomProcessList { } } + private void probeCgroupVersion() { + for (int i = CGROUP_PATH_PREFIXES.length - 1; i >= 0; i--) { + if ((new File(CGROUP_PATH_PREFIXES[i] + Process.SYSTEM_UID)).exists()) { + mCgroupVersion = i; + break; + } + } + } + @VisibleForTesting - static String getCgroupFilePath(int uid, int pid) { - return "/acct/uid_" + uid + "/pid_" + pid + "/cgroup.procs"; + String getCgroupFilePath(int uid, int pid) { + return CGROUP_PATH_PREFIXES[mCgroupVersion] + uid + CGROUP_PID_PREFIX + pid + CGROUP_PROCS; } static String getProcessName(int pid) { diff --git a/services/tests/mockingservicestests/src/com/android/server/am/AppChildProcessTest.java b/services/tests/mockingservicestests/src/com/android/server/am/AppChildProcessTest.java index b85da94604760..17f326fbdbce4 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/AppChildProcessTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/AppChildProcessTest.java @@ -298,7 +298,7 @@ public class AppChildProcessTest { } void addToProcess(int uid, int pid, int newPid) { - final String path = PhantomProcessList.getCgroupFilePath(uid, pid); + final String path = mPhantomProcessList.getCgroupFilePath(uid, pid); StringBuffer sb = mPathToData.get(path); if (sb == null) { sb = new StringBuffer();