Loading services/core/java/com/android/server/am/OomAdjuster.java +18 −10 Original line number Diff line number Diff line Loading @@ -114,6 +114,7 @@ import static com.android.server.am.ProcessList.PERCEPTIBLE_MEDIUM_APP_ADJ; import static com.android.server.am.ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ; import static com.android.server.am.ProcessList.PERSISTENT_SERVICE_ADJ; import static com.android.server.am.ProcessList.PREVIOUS_APP_ADJ; import static com.android.server.am.ProcessList.PREVIOUS_APP_MAX_ADJ; import static com.android.server.am.ProcessList.SCHED_GROUP_BACKGROUND; import static com.android.server.am.ProcessList.SCHED_GROUP_DEFAULT; import static com.android.server.am.ProcessList.SCHED_GROUP_FOREGROUND_WINDOW; Loading Loading @@ -696,7 +697,7 @@ public class OomAdjuster { // In case the app goes from non-cached to cached but it doesn't have other reachable // processes, its adj could be still unknown as of now, assign one. processes.add(app); assignCachedAdjIfNecessary(processes); applyLruAdjust(processes); applyOomAdjLSP(app, false, mInjector.getUptimeMillis(), mInjector.getElapsedRealtimeMillis(), oomAdjReason); } Loading Loading @@ -1086,7 +1087,7 @@ public class OomAdjuster { } mProcessesInCycle.clear(); assignCachedAdjIfNecessary(mProcessList.getLruProcessesLOSP()); applyLruAdjust(mProcessList.getLruProcessesLOSP()); postUpdateOomAdjInnerLSP(oomAdjReason, activeUids, now, nowElapsed, oldTime, true); Loading Loading @@ -1148,8 +1149,9 @@ public class OomAdjuster { } @GuardedBy({"mService", "mProcLock"}) protected void assignCachedAdjIfNecessary(ArrayList<ProcessRecord> lruList) { protected void applyLruAdjust(ArrayList<ProcessRecord> lruList) { final int numLru = lruList.size(); int nextPreviousAppAdj = PREVIOUS_APP_ADJ; if (mConstants.USE_TIERED_CACHED_ADJ) { final long now = mInjector.getUptimeMillis(); int uiTargetAdj = 10; Loading @@ -1159,9 +1161,12 @@ public class OomAdjuster { ProcessRecord app = lruList.get(i); final ProcessStateRecord state = app.mState; final ProcessCachedOptimizerRecord opt = app.mOptRecord; if (!app.isKilledByAm() && app.getThread() != null && (state.getCurAdj() >= UNKNOWN_ADJ || (state.hasShownUi() && state.getCurAdj() >= CACHED_APP_MIN_ADJ))) { final int curAdj = state.getCurAdj(); if (PREVIOUS_APP_ADJ <= curAdj && curAdj <= PREVIOUS_APP_MAX_ADJ) { state.setCurAdj(nextPreviousAppAdj); nextPreviousAppAdj = Math.min(nextPreviousAppAdj + 1, PREVIOUS_APP_MAX_ADJ); } else if (!app.isKilledByAm() && app.getThread() != null && (curAdj >= UNKNOWN_ADJ || (state.hasShownUi() && curAdj >= CACHED_APP_MIN_ADJ))) { final ProcessServiceRecord psr = app.mServices; int targetAdj = CACHED_APP_MIN_ADJ; Loading Loading @@ -1228,10 +1233,13 @@ public class OomAdjuster { for (int i = numLru - 1; i >= 0; i--) { ProcessRecord app = lruList.get(i); final ProcessStateRecord state = app.mState; // If we haven't yet assigned the final cached adj // to the process, do that now. if (!app.isKilledByAm() && app.getThread() != null && state.getCurAdj() >= UNKNOWN_ADJ) { final int curAdj = state.getCurAdj(); if (PREVIOUS_APP_ADJ <= curAdj && curAdj <= PREVIOUS_APP_MAX_ADJ) { state.setCurAdj(nextPreviousAppAdj); nextPreviousAppAdj = Math.min(nextPreviousAppAdj + 1, PREVIOUS_APP_MAX_ADJ); } else if (!app.isKilledByAm() && app.getThread() != null && curAdj >= UNKNOWN_ADJ) { // If we haven't yet assigned the final cached adj to the process, do that now. final ProcessServiceRecord psr = app.mServices; switch (state.getCurProcState()) { case PROCESS_STATE_LAST_ACTIVITY: Loading services/core/java/com/android/server/am/OomAdjusterModernImpl.java +11 −6 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ import static com.android.server.am.ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_AP import static com.android.server.am.ProcessList.PERSISTENT_PROC_ADJ; import static com.android.server.am.ProcessList.PERSISTENT_SERVICE_ADJ; import static com.android.server.am.ProcessList.PREVIOUS_APP_ADJ; import static com.android.server.am.ProcessList.PREVIOUS_APP_MAX_ADJ; import static com.android.server.am.ProcessList.SCHED_GROUP_BACKGROUND; import static com.android.server.am.ProcessList.SERVICE_ADJ; import static com.android.server.am.ProcessList.SERVICE_B_ADJ; Loading Loading @@ -968,7 +969,7 @@ public class OomAdjusterModernImpl extends OomAdjuster { mTmpOomAdjusterArgs.update(topApp, now, UNKNOWN_ADJ, oomAdjReason, null, true); computeConnectionsLSP(); assignCachedAdjIfNecessary(mProcessList.getLruProcessesLOSP()); applyLruAdjust(mProcessList.getLruProcessesLOSP()); postUpdateOomAdjInnerLSP(oomAdjReason, mActiveUids, now, nowElapsed, oldTime, true); } Loading Loading @@ -1049,20 +1050,24 @@ public class OomAdjusterModernImpl extends OomAdjuster { // Now traverse and compute the connections of processes with changed importance. computeConnectionsLSP(); boolean unassignedAdj = false; boolean needLruAdjust = false; for (int i = 0, size = reachables.size(); i < size; i++) { final ProcessStateRecord state = reachables.get(i).mState; state.setReachable(false); state.setCompletedAdjSeq(mAdjSeq); if (state.getCurAdj() >= UNKNOWN_ADJ) { unassignedAdj = true; final int curAdj = state.getCurAdj(); // Processes assigned the PREV oomscore will have a laddered oomscore with respect to // their positions in the LRU list. i.e. prev+0, prev+1, prev+2, etc. final boolean isPrevApp = PREVIOUS_APP_ADJ <= curAdj && curAdj <= PREVIOUS_APP_MAX_ADJ; if (curAdj >= UNKNOWN_ADJ || (Flags.oomadjusterPrevLaddering() && isPrevApp)) { needLruAdjust = true; } } // If all processes have an assigned adj, no need to calculate and assign cached adjs. if (unassignedAdj) { if (needLruAdjust) { // TODO: b/319163103 - optimize cache adj assignment to not require the whole lru list. assignCachedAdjIfNecessary(mProcessList.getLruProcessesLOSP()); applyLruAdjust(mProcessList.getLruProcessesLOSP()); } // Repopulate any uid record that may have changed. Loading services/core/java/com/android/server/am/ProcessList.java +1 −0 Original line number Diff line number Diff line Loading @@ -225,6 +225,7 @@ public final class ProcessList { // UI flow such as clicking on a URI in the e-mail app to view in the browser, // and then pressing back to return to e-mail. public static final int PREVIOUS_APP_ADJ = 700; public static final int PREVIOUS_APP_MAX_ADJ = Flags.oomadjusterPrevLaddering() ? 799 : 700; // This is a process holding the home application -- we want to try // avoiding killing it, even if it would normally be in the background, Loading services/core/java/com/android/server/am/flags.aconfig +8 −0 Original line number Diff line number Diff line Loading @@ -243,3 +243,11 @@ flag { purpose: PURPOSE_BUGFIX } } flag { name: "oomadjuster_prev_laddering" namespace: "system_performance" is_fixed_read_only: true description: "Add +X to the prev scores according to their positions in the process LRU list" bug: "359912586" } No newline at end of file services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +26 −5 Original line number Diff line number Diff line Loading @@ -60,6 +60,7 @@ import static com.android.server.am.ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_AP import static com.android.server.am.ProcessList.PERSISTENT_PROC_ADJ; import static com.android.server.am.ProcessList.PERSISTENT_SERVICE_ADJ; import static com.android.server.am.ProcessList.PREVIOUS_APP_ADJ; import static com.android.server.am.ProcessList.PREVIOUS_APP_MAX_ADJ; import static com.android.server.am.ProcessList.SCHED_GROUP_BACKGROUND; import static com.android.server.am.ProcessList.SCHED_GROUP_DEFAULT; import static com.android.server.am.ProcessList.SCHED_GROUP_FOREGROUND_WINDOW; Loading Loading @@ -129,6 +130,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; /** * Test class for {@link OomAdjuster}. Loading Loading @@ -897,10 +899,27 @@ public class MockingOomAdjusterTests { followUpTimeCaptor.capture()); } @SuppressWarnings("GuardedBy") @Test public void testUpdateOomAdj_DoPending_PreviousApp() { testUpdateOomAdj_PreviousApp(apps -> { for (ProcessRecord app : apps) { mProcessStateController.enqueueUpdateTarget(app); } mProcessStateController.runPendingUpdate(OOM_ADJ_REASON_NONE); }); } @SuppressWarnings("GuardedBy") @Test public void testUpdateOomAdj_DoAll_PreviousApp() { final int numberOfApps = 15; testUpdateOomAdj_PreviousApp(apps -> { mProcessStateController.runFullUpdate(OOM_ADJ_REASON_NONE); }); } private void testUpdateOomAdj_PreviousApp(Consumer<ProcessRecord[]> updater) { final int numberOfApps = 105; final ProcessRecord[] apps = new ProcessRecord[numberOfApps]; for (int i = 0; i < numberOfApps; i++) { apps[i] = spy(makeDefaultProcessRecord(MOCKAPP_PID + i, MOCKAPP_UID + i, Loading @@ -911,10 +930,11 @@ public class MockingOomAdjusterTests { } setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE); setProcessesToLru(apps); mProcessStateController.runFullUpdate(OOM_ADJ_REASON_NONE); updater.accept(apps); for (int i = 0; i < numberOfApps; i++) { assertProcStates(apps[i], PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ, final int mruIndex = numberOfApps - i - 1; final int expectedAdj = Math.min(PREVIOUS_APP_ADJ + mruIndex, PREVIOUS_APP_MAX_ADJ); assertProcStates(apps[i], PROCESS_STATE_LAST_ACTIVITY, expectedAdj, SCHED_GROUP_BACKGROUND, "previous"); } Loading Loading @@ -3184,7 +3204,8 @@ public class MockingOomAdjusterTests { setProcessesToLru(app1, app2); mProcessStateController.runFullUpdate(OOM_ADJ_REASON_NONE); assertProcStates(app1, PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ, assertProcStates(app1, PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ + (Flags.oomadjusterPrevLaddering() ? 1 : 0), SCHED_GROUP_BACKGROUND, "recent-provider"); assertProcStates(app2, PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ, SCHED_GROUP_BACKGROUND, "recent-provider"); Loading Loading
services/core/java/com/android/server/am/OomAdjuster.java +18 −10 Original line number Diff line number Diff line Loading @@ -114,6 +114,7 @@ import static com.android.server.am.ProcessList.PERCEPTIBLE_MEDIUM_APP_ADJ; import static com.android.server.am.ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ; import static com.android.server.am.ProcessList.PERSISTENT_SERVICE_ADJ; import static com.android.server.am.ProcessList.PREVIOUS_APP_ADJ; import static com.android.server.am.ProcessList.PREVIOUS_APP_MAX_ADJ; import static com.android.server.am.ProcessList.SCHED_GROUP_BACKGROUND; import static com.android.server.am.ProcessList.SCHED_GROUP_DEFAULT; import static com.android.server.am.ProcessList.SCHED_GROUP_FOREGROUND_WINDOW; Loading Loading @@ -696,7 +697,7 @@ public class OomAdjuster { // In case the app goes from non-cached to cached but it doesn't have other reachable // processes, its adj could be still unknown as of now, assign one. processes.add(app); assignCachedAdjIfNecessary(processes); applyLruAdjust(processes); applyOomAdjLSP(app, false, mInjector.getUptimeMillis(), mInjector.getElapsedRealtimeMillis(), oomAdjReason); } Loading Loading @@ -1086,7 +1087,7 @@ public class OomAdjuster { } mProcessesInCycle.clear(); assignCachedAdjIfNecessary(mProcessList.getLruProcessesLOSP()); applyLruAdjust(mProcessList.getLruProcessesLOSP()); postUpdateOomAdjInnerLSP(oomAdjReason, activeUids, now, nowElapsed, oldTime, true); Loading Loading @@ -1148,8 +1149,9 @@ public class OomAdjuster { } @GuardedBy({"mService", "mProcLock"}) protected void assignCachedAdjIfNecessary(ArrayList<ProcessRecord> lruList) { protected void applyLruAdjust(ArrayList<ProcessRecord> lruList) { final int numLru = lruList.size(); int nextPreviousAppAdj = PREVIOUS_APP_ADJ; if (mConstants.USE_TIERED_CACHED_ADJ) { final long now = mInjector.getUptimeMillis(); int uiTargetAdj = 10; Loading @@ -1159,9 +1161,12 @@ public class OomAdjuster { ProcessRecord app = lruList.get(i); final ProcessStateRecord state = app.mState; final ProcessCachedOptimizerRecord opt = app.mOptRecord; if (!app.isKilledByAm() && app.getThread() != null && (state.getCurAdj() >= UNKNOWN_ADJ || (state.hasShownUi() && state.getCurAdj() >= CACHED_APP_MIN_ADJ))) { final int curAdj = state.getCurAdj(); if (PREVIOUS_APP_ADJ <= curAdj && curAdj <= PREVIOUS_APP_MAX_ADJ) { state.setCurAdj(nextPreviousAppAdj); nextPreviousAppAdj = Math.min(nextPreviousAppAdj + 1, PREVIOUS_APP_MAX_ADJ); } else if (!app.isKilledByAm() && app.getThread() != null && (curAdj >= UNKNOWN_ADJ || (state.hasShownUi() && curAdj >= CACHED_APP_MIN_ADJ))) { final ProcessServiceRecord psr = app.mServices; int targetAdj = CACHED_APP_MIN_ADJ; Loading Loading @@ -1228,10 +1233,13 @@ public class OomAdjuster { for (int i = numLru - 1; i >= 0; i--) { ProcessRecord app = lruList.get(i); final ProcessStateRecord state = app.mState; // If we haven't yet assigned the final cached adj // to the process, do that now. if (!app.isKilledByAm() && app.getThread() != null && state.getCurAdj() >= UNKNOWN_ADJ) { final int curAdj = state.getCurAdj(); if (PREVIOUS_APP_ADJ <= curAdj && curAdj <= PREVIOUS_APP_MAX_ADJ) { state.setCurAdj(nextPreviousAppAdj); nextPreviousAppAdj = Math.min(nextPreviousAppAdj + 1, PREVIOUS_APP_MAX_ADJ); } else if (!app.isKilledByAm() && app.getThread() != null && curAdj >= UNKNOWN_ADJ) { // If we haven't yet assigned the final cached adj to the process, do that now. final ProcessServiceRecord psr = app.mServices; switch (state.getCurProcState()) { case PROCESS_STATE_LAST_ACTIVITY: Loading
services/core/java/com/android/server/am/OomAdjusterModernImpl.java +11 −6 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ import static com.android.server.am.ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_AP import static com.android.server.am.ProcessList.PERSISTENT_PROC_ADJ; import static com.android.server.am.ProcessList.PERSISTENT_SERVICE_ADJ; import static com.android.server.am.ProcessList.PREVIOUS_APP_ADJ; import static com.android.server.am.ProcessList.PREVIOUS_APP_MAX_ADJ; import static com.android.server.am.ProcessList.SCHED_GROUP_BACKGROUND; import static com.android.server.am.ProcessList.SERVICE_ADJ; import static com.android.server.am.ProcessList.SERVICE_B_ADJ; Loading Loading @@ -968,7 +969,7 @@ public class OomAdjusterModernImpl extends OomAdjuster { mTmpOomAdjusterArgs.update(topApp, now, UNKNOWN_ADJ, oomAdjReason, null, true); computeConnectionsLSP(); assignCachedAdjIfNecessary(mProcessList.getLruProcessesLOSP()); applyLruAdjust(mProcessList.getLruProcessesLOSP()); postUpdateOomAdjInnerLSP(oomAdjReason, mActiveUids, now, nowElapsed, oldTime, true); } Loading Loading @@ -1049,20 +1050,24 @@ public class OomAdjusterModernImpl extends OomAdjuster { // Now traverse and compute the connections of processes with changed importance. computeConnectionsLSP(); boolean unassignedAdj = false; boolean needLruAdjust = false; for (int i = 0, size = reachables.size(); i < size; i++) { final ProcessStateRecord state = reachables.get(i).mState; state.setReachable(false); state.setCompletedAdjSeq(mAdjSeq); if (state.getCurAdj() >= UNKNOWN_ADJ) { unassignedAdj = true; final int curAdj = state.getCurAdj(); // Processes assigned the PREV oomscore will have a laddered oomscore with respect to // their positions in the LRU list. i.e. prev+0, prev+1, prev+2, etc. final boolean isPrevApp = PREVIOUS_APP_ADJ <= curAdj && curAdj <= PREVIOUS_APP_MAX_ADJ; if (curAdj >= UNKNOWN_ADJ || (Flags.oomadjusterPrevLaddering() && isPrevApp)) { needLruAdjust = true; } } // If all processes have an assigned adj, no need to calculate and assign cached adjs. if (unassignedAdj) { if (needLruAdjust) { // TODO: b/319163103 - optimize cache adj assignment to not require the whole lru list. assignCachedAdjIfNecessary(mProcessList.getLruProcessesLOSP()); applyLruAdjust(mProcessList.getLruProcessesLOSP()); } // Repopulate any uid record that may have changed. Loading
services/core/java/com/android/server/am/ProcessList.java +1 −0 Original line number Diff line number Diff line Loading @@ -225,6 +225,7 @@ public final class ProcessList { // UI flow such as clicking on a URI in the e-mail app to view in the browser, // and then pressing back to return to e-mail. public static final int PREVIOUS_APP_ADJ = 700; public static final int PREVIOUS_APP_MAX_ADJ = Flags.oomadjusterPrevLaddering() ? 799 : 700; // This is a process holding the home application -- we want to try // avoiding killing it, even if it would normally be in the background, Loading
services/core/java/com/android/server/am/flags.aconfig +8 −0 Original line number Diff line number Diff line Loading @@ -243,3 +243,11 @@ flag { purpose: PURPOSE_BUGFIX } } flag { name: "oomadjuster_prev_laddering" namespace: "system_performance" is_fixed_read_only: true description: "Add +X to the prev scores according to their positions in the process LRU list" bug: "359912586" } No newline at end of file
services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +26 −5 Original line number Diff line number Diff line Loading @@ -60,6 +60,7 @@ import static com.android.server.am.ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_AP import static com.android.server.am.ProcessList.PERSISTENT_PROC_ADJ; import static com.android.server.am.ProcessList.PERSISTENT_SERVICE_ADJ; import static com.android.server.am.ProcessList.PREVIOUS_APP_ADJ; import static com.android.server.am.ProcessList.PREVIOUS_APP_MAX_ADJ; import static com.android.server.am.ProcessList.SCHED_GROUP_BACKGROUND; import static com.android.server.am.ProcessList.SCHED_GROUP_DEFAULT; import static com.android.server.am.ProcessList.SCHED_GROUP_FOREGROUND_WINDOW; Loading Loading @@ -129,6 +130,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; /** * Test class for {@link OomAdjuster}. Loading Loading @@ -897,10 +899,27 @@ public class MockingOomAdjusterTests { followUpTimeCaptor.capture()); } @SuppressWarnings("GuardedBy") @Test public void testUpdateOomAdj_DoPending_PreviousApp() { testUpdateOomAdj_PreviousApp(apps -> { for (ProcessRecord app : apps) { mProcessStateController.enqueueUpdateTarget(app); } mProcessStateController.runPendingUpdate(OOM_ADJ_REASON_NONE); }); } @SuppressWarnings("GuardedBy") @Test public void testUpdateOomAdj_DoAll_PreviousApp() { final int numberOfApps = 15; testUpdateOomAdj_PreviousApp(apps -> { mProcessStateController.runFullUpdate(OOM_ADJ_REASON_NONE); }); } private void testUpdateOomAdj_PreviousApp(Consumer<ProcessRecord[]> updater) { final int numberOfApps = 105; final ProcessRecord[] apps = new ProcessRecord[numberOfApps]; for (int i = 0; i < numberOfApps; i++) { apps[i] = spy(makeDefaultProcessRecord(MOCKAPP_PID + i, MOCKAPP_UID + i, Loading @@ -911,10 +930,11 @@ public class MockingOomAdjusterTests { } setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE); setProcessesToLru(apps); mProcessStateController.runFullUpdate(OOM_ADJ_REASON_NONE); updater.accept(apps); for (int i = 0; i < numberOfApps; i++) { assertProcStates(apps[i], PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ, final int mruIndex = numberOfApps - i - 1; final int expectedAdj = Math.min(PREVIOUS_APP_ADJ + mruIndex, PREVIOUS_APP_MAX_ADJ); assertProcStates(apps[i], PROCESS_STATE_LAST_ACTIVITY, expectedAdj, SCHED_GROUP_BACKGROUND, "previous"); } Loading Loading @@ -3184,7 +3204,8 @@ public class MockingOomAdjusterTests { setProcessesToLru(app1, app2); mProcessStateController.runFullUpdate(OOM_ADJ_REASON_NONE); assertProcStates(app1, PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ, assertProcStates(app1, PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ + (Flags.oomadjusterPrevLaddering() ? 1 : 0), SCHED_GROUP_BACKGROUND, "recent-provider"); assertProcStates(app2, PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ, SCHED_GROUP_BACKGROUND, "recent-provider"); Loading