Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2ed42dc6 authored by Yasin Kilicdere's avatar Yasin Kilicdere Committed by Android (Google) Code Review
Browse files

Merge "Separate the PREVIOUS_APP_ADJ scores." into main

parents cd48e7c1 ef96b34c
Loading
Loading
Loading
Loading
+18 −10
Original line number Diff line number Diff line
@@ -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;
@@ -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);
        }
@@ -1086,7 +1087,7 @@ public class OomAdjuster {
        }
        mProcessesInCycle.clear();

        assignCachedAdjIfNecessary(mProcessList.getLruProcessesLOSP());
        applyLruAdjust(mProcessList.getLruProcessesLOSP());

        postUpdateOomAdjInnerLSP(oomAdjReason, activeUids, now, nowElapsed, oldTime, true);

@@ -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;
@@ -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;

@@ -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:
+11 −6
Original line number Diff line number Diff line
@@ -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;
@@ -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);
    }

@@ -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.
+1 −0
Original line number Diff line number Diff line
@@ -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,
+8 −0
Original line number Diff line number Diff line
@@ -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
+26 −5
Original line number Diff line number Diff line
@@ -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;
@@ -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}.
@@ -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,
@@ -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");
        }

@@ -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");