diff options
author | 2024-12-10 23:34:13 +0000 | |
---|---|---|
committer | 2024-12-18 01:39:24 +0000 | |
commit | f6ec45a1b776cf92f73705f92589ac2a31be2a32 (patch) | |
tree | a819e7d4f5556674c7657f15b0ae3956dac431a2 | |
parent | 7b64171769bd4c75518bff8d9e01158f3d467cec (diff) |
Use libprocessgroup to find cgroup v2 paths
Cgroup v2 paths are owned by libprocessgroup. Those paths can change
based on build flags, so paths generated outside of libprocessgroup may
not always be correct.
Additionally, the cpuacct controller has not been mounted at /acct since
2018 with commit 192aee782 ("libprocessgroup: Add support for task
profiles"), so remove the broken "v1" support.
Bug: 382693152
Flag: EXEMPT refactor
Test: atest FrameworksMockingServicesTests:AppChildProcessTest
Test: atest CtsAppTestCases:ActivityManagerTest
Change-Id: Ibd187b2d784ef4cb40099f30cd95206fb0536a98
Merged-In: Ibd187b2d784ef4cb40099f30cd95206fb0536a98
-rw-r--r-- | services/core/java/com/android/server/am/PhantomProcessList.java | 35 | ||||
-rw-r--r-- | services/core/jni/Android.bp | 8 | ||||
-rw-r--r-- | services/core/jni/com_android_server_am_PhantomProcessList.cpp | 49 | ||||
-rw-r--r-- | services/core/jni/onload.cpp | 2 | ||||
-rw-r--r-- | services/tests/mockingservicestests/jni/Android.bp | 1 | ||||
-rw-r--r-- | services/tests/mockingservicestests/jni/onload.cpp | 2 |
6 files changed, 73 insertions, 24 deletions
diff --git a/services/core/java/com/android/server/am/PhantomProcessList.java b/services/core/java/com/android/server/am/PhantomProcessList.java index 2ec1aedd18f9..5bd9c054dbf8 100644 --- a/services/core/java/com/android/server/am/PhantomProcessList.java +++ b/services/core/java/com/android/server/am/PhantomProcessList.java @@ -112,23 +112,10 @@ 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 @@ -157,9 +144,15 @@ public final class PhantomProcessList { final int appPid = app.getPid(); InputStream input = mCgroupProcsFds.get(appPid); if (input == null) { - final String path = getCgroupFilePath(app.info.uid, appPid); + String path = null; try { + path = getCgroupFilePath(app.info.uid, appPid); input = mInjector.openCgroupProcs(path); + } catch (IllegalArgumentException e) { + if (DEBUG_PROCESSES) { + Slog.w(TAG, "Unable to obtain cgroup.procs path ", e); + } + return; } catch (FileNotFoundException | SecurityException e) { if (DEBUG_PROCESSES) { Slog.w(TAG, "Unable to open " + path, e); @@ -207,18 +200,9 @@ 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 String getCgroupFilePath(int uid, int pid) { - return CGROUP_PATH_PREFIXES[mCgroupVersion] + uid + CGROUP_PID_PREFIX + pid + CGROUP_PROCS; + return nativeGetCgroupProcsPath(uid, pid); } static String getProcessName(int pid) { @@ -605,4 +589,7 @@ public final class PhantomProcessList { return PhantomProcessList.getProcessName(pid); } } + + private static native String nativeGetCgroupProcsPath(int uid, int pid) + throws IllegalArgumentException; } diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index 2c0390241593..97ae6be0c2bc 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -79,6 +79,7 @@ cc_library_static { ":lib_oomConnection_native", ":lib_anrTimer_native", ":lib_lazilyRegisteredServices_native", + ":lib_phantomProcessList_native", ], include_dirs: [ @@ -264,3 +265,10 @@ filegroup { "com_android_server_vr_VrManagerService.cpp", ], } + +filegroup { + name: "lib_phantomProcessList_native", + srcs: [ + "com_android_server_am_PhantomProcessList.cpp", + ], +} diff --git a/services/core/jni/com_android_server_am_PhantomProcessList.cpp b/services/core/jni/com_android_server_am_PhantomProcessList.cpp new file mode 100644 index 000000000000..0c5e6d85919a --- /dev/null +++ b/services/core/jni/com_android_server_am_PhantomProcessList.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <jni.h> +#include <nativehelper/JNIHelp.h> +#include <processgroup/processgroup.h> + +namespace android { +namespace { + +jstring getCgroupProcsPath(JNIEnv* env, jobject clazz, jint uid, jint pid) { + if (uid < 0) { + jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", "uid is negative: %d", uid); + return nullptr; + } + + std::string path; + if (!CgroupGetAttributePathForProcess("CgroupProcs", uid, pid, path)) { + path.clear(); + } + + return env->NewStringUTF(path.c_str()); +} + +const JNINativeMethod sMethods[] = { + {"nativeGetCgroupProcsPath", "(II)Ljava/lang/String;", (void*)getCgroupProcsPath}, +}; + +} // anonymous namespace + +int register_android_server_am_PhantomProcessList(JNIEnv* env) { + const char* className = "com/android/server/am/PhantomProcessList"; + return jniRegisterNativeMethods(env, className, sMethods, NELEM(sMethods)); +} + +} // namespace android
\ No newline at end of file diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp index df37ec3ef037..a12eb319b9fa 100644 --- a/services/core/jni/onload.cpp +++ b/services/core/jni/onload.cpp @@ -70,6 +70,7 @@ int register_com_android_server_display_DisplayControl(JNIEnv* env); int register_com_android_server_SystemClockTime(JNIEnv* env); int register_android_server_display_smallAreaDetectionController(JNIEnv* env); int register_com_android_server_accessibility_BrailleDisplayConnection(JNIEnv* env); +int register_android_server_am_PhantomProcessList(JNIEnv* env); // Note: Consider adding new JNI entrypoints for optional services to // LazyJniRegistrar instead, and relying on lazy registration. @@ -135,5 +136,6 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) register_com_android_server_SystemClockTime(env); register_android_server_display_smallAreaDetectionController(env); register_com_android_server_accessibility_BrailleDisplayConnection(env); + register_android_server_am_PhantomProcessList(env); return JNI_VERSION_1_4; } diff --git a/services/tests/mockingservicestests/jni/Android.bp b/services/tests/mockingservicestests/jni/Android.bp index 94d4b9522d60..03bd73c52083 100644 --- a/services/tests/mockingservicestests/jni/Android.bp +++ b/services/tests/mockingservicestests/jni/Android.bp @@ -24,6 +24,7 @@ cc_library_shared { ":lib_freezer_native", ":lib_oomConnection_native", ":lib_lazilyRegisteredServices_native", + ":lib_phantomProcessList_native", "onload.cpp", ], diff --git a/services/tests/mockingservicestests/jni/onload.cpp b/services/tests/mockingservicestests/jni/onload.cpp index 9b4c8178b092..30fa7de94af1 100644 --- a/services/tests/mockingservicestests/jni/onload.cpp +++ b/services/tests/mockingservicestests/jni/onload.cpp @@ -28,6 +28,7 @@ int register_android_server_am_CachedAppOptimizer(JNIEnv* env); int register_android_server_am_Freezer(JNIEnv* env); int register_android_server_am_OomConnection(JNIEnv* env); int register_android_server_utils_LazyJniRegistrar(JNIEnv* env); +int register_android_server_am_PhantomProcessList(JNIEnv* env); }; using namespace android; @@ -46,5 +47,6 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) register_android_server_am_Freezer(env); register_android_server_am_OomConnection(env); register_android_server_utils_LazyJniRegistrar(env); + register_android_server_am_PhantomProcessList(env); return JNI_VERSION_1_4; } |