summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Austin Borger <borgera@google.com> 2022-03-08 13:25:58 -0800
committer Austin Borger <borgera@google.com> 2022-03-23 11:55:10 -0700
commit177d5bb18756ddca6e9f9e8caa0338ae07f21c92 (patch)
tree85f19739f86f06d41adfb634cab417f5fb6a8323
parent329ed6ef8e3dda96409130e1200faa106f0c4835 (diff)
Modify UidRecord.CHANGE_PROCSTATE such that it behaves like a bit mask.
UidRecord.CHANGE_PROCSTATE was allocated the value 0, since it is assumed that if there is any change to a UidRecord it includes a proc state change. This is a valid assumption, but is not an unusual design for a bitmask. This change adds a bit specifically for proc state changes. At the time of this change, CHANGE_PROCSTATE should always be set. However the intention is to pre-empt change I68d964f474d20f819f54b614a4e314ce00aac8fb, which breaks the assumption that all UidRecord changes will include proc state. To avoid verbosity, additional constants have been defined which combine the other change bits with CHANGE_PROCSTATE for external users to reference. Change-Id: Iae7e6601938d1b3ee5c4c9b339ae06029eb598e6 Bug: 124224342 Test: -- ActivityManagerServiceTest -- ActivityManagerProcessStateTest -- ActivityManagerFgsBgStartTest -- UidObserverControllerTest -- CtsAppTestCases
-rw-r--r--core/proto/android/server/activitymanagerservice.proto1
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java2
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java9
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java2
-rw-r--r--services/core/java/com/android/server/am/UidObserverController.java3
-rw-r--r--services/core/java/com/android/server/am/UidRecord.java25
6 files changed, 30 insertions, 12 deletions
diff --git a/core/proto/android/server/activitymanagerservice.proto b/core/proto/android/server/activitymanagerservice.proto
index 17dc4589d402..2bb891280e71 100644
--- a/core/proto/android/server/activitymanagerservice.proto
+++ b/core/proto/android/server/activitymanagerservice.proto
@@ -779,6 +779,7 @@ message UidRecordProto {
CHANGE_CACHED = 3;
CHANGE_UNCACHED = 4;
CHANGE_CAPABILITY = 5;
+ CHANGE_PROCSTATE = 6;
}
repeated Change last_reported_changes = 8;
optional int32 num_procs = 9;
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index c40f65f54210..45f06c74cac2 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -15528,7 +15528,7 @@ public class ActivityManagerService extends IActivityManager.Stub
@GuardedBy("this")
final void doStopUidLocked(int uid, final UidRecord uidRec) {
mServices.stopInBackgroundLocked(uid);
- enqueueUidChangeLocked(uidRec, uid, UidRecord.CHANGE_IDLE);
+ enqueueUidChangeLocked(uidRec, uid, UidRecord.CHANGE_IDLE | UidRecord.CHANGE_PROCSTATE);
}
/**
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 9626bbe0b4b2..85d3d5dca16b 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -1191,7 +1191,7 @@ public class OomAdjuster {
}
for (int i = activeUids.size() - 1; i >= 0; i--) {
final UidRecord uidRec = activeUids.valueAt(i);
- int uidChange = UidRecord.CHANGE_PROCSTATE;
+ int uidChange = 0;
if (uidRec.getCurProcState() != PROCESS_STATE_NONEXISTENT
&& (uidRec.getSetProcState() != uidRec.getCurProcState()
|| uidRec.getSetCapability() != uidRec.getCurCapability()
@@ -1219,12 +1219,12 @@ public class OomAdjuster {
}
}
if (uidRec.isIdle() && !uidRec.isSetIdle()) {
- uidChange = UidRecord.CHANGE_IDLE;
+ uidChange |= UidRecord.CHANGE_IDLE;
becameIdle.add(uidRec);
}
} else {
if (uidRec.isIdle()) {
- uidChange = UidRecord.CHANGE_ACTIVE;
+ uidChange |= UidRecord.CHANGE_ACTIVE;
EventLogTags.writeAmUidActive(uidRec.getUid());
uidRec.setIdle(false);
}
@@ -1241,6 +1241,9 @@ public class OomAdjuster {
if (uidRec.getSetCapability() != uidRec.getCurCapability()) {
uidChange |= UidRecord.CHANGE_CAPABILITY;
}
+ if (uidRec.getSetProcState() != uidRec.getCurProcState()) {
+ uidChange |= UidRecord.CHANGE_PROCSTATE;
+ }
uidRec.setSetProcState(uidRec.getCurProcState());
uidRec.setSetCapability(uidRec.getCurCapability());
uidRec.setSetAllowListed(uidRec.isCurAllowListed());
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 253686c2602d..a8612fd8b190 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -3031,7 +3031,7 @@ public final class ProcessList {
Slog.i(TAG_UID_OBSERVERS, "No more processes in " + uidRecord);
}
mService.enqueueUidChangeLocked(uidRecord, -1,
- UidRecord.CHANGE_GONE);
+ UidRecord.CHANGE_GONE | UidRecord.CHANGE_PROCSTATE);
EventLogTags.writeAmUidStopped(uid);
mActiveUids.remove(uid);
mService.mFgsStartTempAllowList.removeUid(record.info.uid);
diff --git a/services/core/java/com/android/server/am/UidObserverController.java b/services/core/java/com/android/server/am/UidObserverController.java
index f6a184119bb4..c3a232aac4b5 100644
--- a/services/core/java/com/android/server/am/UidObserverController.java
+++ b/services/core/java/com/android/server/am/UidObserverController.java
@@ -154,6 +154,9 @@ public class UidObserverController {
if ((pendingChange & UidRecord.CHANGE_CAPABILITY) != 0) {
currentChange |= UidRecord.CHANGE_CAPABILITY;
}
+ if ((pendingChange & UidRecord.CHANGE_PROCSTATE) != 0) {
+ currentChange |= UidRecord.CHANGE_PROCSTATE;
+ }
return currentChange;
}
diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java
index 6101e267effc..606e6fc82650 100644
--- a/services/core/java/com/android/server/am/UidRecord.java
+++ b/services/core/java/com/android/server/am/UidRecord.java
@@ -117,13 +117,16 @@ public final class UidRecord {
*/
final Object networkStateLock = new Object();
- static final int CHANGE_PROCSTATE = 0;
- static final int CHANGE_GONE = 1<<0;
- static final int CHANGE_IDLE = 1<<1;
- static final int CHANGE_ACTIVE = 1<<2;
- static final int CHANGE_CACHED = 1<<3;
- static final int CHANGE_UNCACHED = 1<<4;
- static final int CHANGE_CAPABILITY = 1<<5;
+ /*
+ * Change bitmask flags.
+ */
+ static final int CHANGE_GONE = 1 << 0;
+ static final int CHANGE_IDLE = 1 << 1;
+ static final int CHANGE_ACTIVE = 1 << 2;
+ static final int CHANGE_CACHED = 1 << 3;
+ static final int CHANGE_UNCACHED = 1 << 4;
+ static final int CHANGE_CAPABILITY = 1 << 5;
+ static final int CHANGE_PROCSTATE = 1 << 31;
// Keep the enum lists in sync
private static int[] ORIG_ENUMS = new int[] {
@@ -133,6 +136,7 @@ public final class UidRecord {
CHANGE_CACHED,
CHANGE_UNCACHED,
CHANGE_CAPABILITY,
+ CHANGE_PROCSTATE,
};
private static int[] PROTO_ENUMS = new int[] {
UidRecordProto.CHANGE_GONE,
@@ -141,6 +145,7 @@ public final class UidRecord {
UidRecordProto.CHANGE_CACHED,
UidRecordProto.CHANGE_UNCACHED,
UidRecordProto.CHANGE_CAPABILITY,
+ UidRecordProto.CHANGE_PROCSTATE,
};
// UidObserverController is the only thing that should modify this.
@@ -417,6 +422,12 @@ public final class UidRecord {
}
sb.append("uncached");
}
+ if ((mLastReportedChange & CHANGE_PROCSTATE) != 0) {
+ if (printed) {
+ sb.append("|");
+ }
+ sb.append("procstate");
+ }
}
sb.append(" procs:");
sb.append(mNumProcs);