summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jing Ji <jji@google.com> 2023-06-15 16:28:39 -0700
committer Jing Ji <jji@google.com> 2023-06-15 16:28:39 -0700
commit87dbb46da80c124fd37e2a6bbb9b78f1242c9ed9 (patch)
tree80c723cca17dbac805d8f32c1c025eca16a7b79f
parent0f07b01f6cd441acd9d61fb271de64904c2327f0 (diff)
Use the UNKNOWN_ADJ as the cached adj in cycle recomputation
This reverts the behavior introduced in a previous commit 853d509, where if a cached app binds to a non-cached app, and this cached app forms cycles with other cached apps, it might end up bumping the oom adj score to the non-cached state. So now we'll be using the UNKNOWN_ADJ. And as we're doing cached oom adj assignment after that so we won't be running into the unassigned adj problem. Bug: 286750917 Test: atest MockingOomAdjusterTests Change-Id: I9284d3d6318dccac1460adae12f24f89bd85b88e
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java5
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java29
2 files changed, 32 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 764bbe8bd191..f21ad2204d74 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -1009,7 +1009,6 @@ public class OomAdjuster {
mCacheOomRanker.reRankLruCachedAppsLSP(mProcessList.getLruProcessesLSP(),
mProcessList.getLruProcessServiceStartLOSP());
}
- assignCachedAdjIfNecessary(mProcessList.getLruProcessesLOSP());
if (computeClients) { // There won't be cycles if we didn't compute clients above.
// Cycle strategy:
@@ -1034,7 +1033,7 @@ public class OomAdjuster {
ProcessRecord app = activeProcesses.get(i);
final ProcessStateRecord state = app.mState;
if (!app.isKilledByAm() && app.getThread() != null && state.containsCycle()) {
- if (computeOomAdjLSP(app, state.getCurRawAdj(), topApp, true, now,
+ if (computeOomAdjLSP(app, UNKNOWN_ADJ, topApp, true, now,
true, true)) {
retryCycles = true;
}
@@ -1044,6 +1043,8 @@ public class OomAdjuster {
}
mProcessesInCycle.clear();
+ assignCachedAdjIfNecessary(mProcessList.getLruProcessesLOSP());
+
mNumNonCachedProcs = 0;
mNumCachedHiddenProcs = 0;
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
index 770f04a2db5e..60e2af5f283c 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java
@@ -2512,6 +2512,35 @@ public class MockingOomAdjusterTests {
assertEquals(FOREGROUND_APP_ADJ, app.mState.getSetAdj());
}
+ @SuppressWarnings("GuardedBy")
+ @Test
+ public void testUpdateOomAdj_DoAll_Side_Cycle() {
+ final ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
+ MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
+ final ProcessRecord app2 = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
+ MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
+ final ProcessRecord app3 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
+ MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
+ long now = SystemClock.uptimeMillis();
+ ServiceRecord s = bindService(app, app2, null, 0, mock(IBinder.class));
+ s.startRequested = true;
+ s.lastActivity = now;
+ s = bindService(app2, app3, null, 0, mock(IBinder.class));
+ s.lastActivity = now;
+ s = bindService(app3, app2, null, 0, mock(IBinder.class));
+ s.lastActivity = now;
+
+ sService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
+ sService.mOomAdjuster.mNumServiceProcs = 3;
+ updateOomAdj(app, app2, app3);
+
+ assertEquals(SERVICE_ADJ, app.mState.getSetAdj());
+ assertTrue(sFirstCachedAdj <= app2.mState.getSetAdj());
+ assertTrue(sFirstCachedAdj <= app3.mState.getSetAdj());
+ assertTrue(CACHED_APP_MAX_ADJ >= app2.mState.getSetAdj());
+ assertTrue(CACHED_APP_MAX_ADJ >= app3.mState.getSetAdj());
+ }
+
private ProcessRecord makeDefaultProcessRecord(int pid, int uid, String processName,
String packageName, boolean hasShownUi) {
long now = SystemClock.uptimeMillis();