From 77d75bf13e13e702a4d0811fcde8b525b2501d52 Mon Sep 17 00:00:00 2001 From: Matt Buckley Date: Fri, 31 Mar 2023 00:22:28 +0000 Subject: [PATCH] Change "checkTidValid" to only call into AM if necessary Currently calling into AM during createHintSession causes a lot of overhead in situations where it isn't really needed. This patch just makes the call lazy and only evaluates it if it's necessary to fully check the tid list. Bug: 272002264 Test: manual Change-Id: I547010f2fac1d3128527d456ccb82ad68b277d3a --- .../server/power/hint/HintManagerService.java | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/services/core/java/com/android/server/power/hint/HintManagerService.java b/services/core/java/com/android/server/power/hint/HintManagerService.java index a9a1d5e9102c9..1a22b89045799 100644 --- a/services/core/java/com/android/server/power/hint/HintManagerService.java +++ b/services/core/java/com/android/server/power/hint/HintManagerService.java @@ -48,7 +48,6 @@ import com.android.server.utils.Slogf; import java.io.FileDescriptor; import java.io.PrintWriter; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -324,16 +323,7 @@ public final class HintManagerService extends SystemService { private boolean checkTidValid(int uid, int tgid, int [] tids) { // Make sure all tids belongs to the same UID (including isolated UID), // tids can belong to different application processes. - List eligiblePids = null; - // To avoid deadlock, do not call into AMS if the call is from system. - if (uid != Process.SYSTEM_UID) { - eligiblePids = mAmInternal.getIsolatedProcesses(uid); - } - if (eligiblePids == null) { - eligiblePids = new ArrayList<>(); - } - eligiblePids.add(tgid); - + List isolatedPids = null; for (int threadId : tids) { final String[] procStatusKeys = new String[] { "Uid:", @@ -345,7 +335,21 @@ public final class HintManagerService extends SystemService { int pidOfThreadId = (int) output[1]; // use PID check for isolated processes, use UID check for non-isolated processes. - if (eligiblePids.contains(pidOfThreadId) || uidOfThreadId == uid) { + if (pidOfThreadId == tgid || uidOfThreadId == uid) { + continue; + } + // Only call into AM if the tid is either isolated or invalid + if (isolatedPids == null) { + // To avoid deadlock, do not call into AMS if the call is from system. + if (uid == Process.SYSTEM_UID) { + return false; + } + isolatedPids = mAmInternal.getIsolatedProcesses(uid); + if (isolatedPids == null) { + return false; + } + } + if (isolatedPids.contains(pidOfThreadId)) { continue; } return false;