diff options
| author | 2023-06-15 16:28:39 -0700 | |
|---|---|---|
| committer | 2023-06-15 16:28:39 -0700 | |
| commit | 87dbb46da80c124fd37e2a6bbb9b78f1242c9ed9 (patch) | |
| tree | 80c723cca17dbac805d8f32c1c025eca16a7b79f | |
| parent | 0f07b01f6cd441acd9d61fb271de64904c2327f0 (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.java | 5 | ||||
| -rw-r--r-- | services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java | 29 |
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(); |