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

Commit d2aa4e19 authored by Amith Yamasani's avatar Amith Yamasani
Browse files

Fix for incorrect cycle evaluation in computeOomAdj DO NOT MERGE

Use the conservative value of adj and procstate if at least
one evaluation pass was completed, even if the value is not
final. The later iterations through the procs that have
cycles will elevate the apps if necessary. Otherwise the
dependencies will just get stuck in a low state.

Bug: 79643956
Test: Manual test of connecting to AA and turning off screen
      atest CtsAppTestCases:ActivityManagerProcessStateTest

Change-Id: If520eb239935782e2487b16e8bb650ded775f184
parent 15c1e47e
Loading
Loading
Loading
Loading
+25 −11
Original line number Diff line number Diff line
@@ -23042,6 +23042,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                // The process is being computed, so there is a cycle. We cannot
                // rely on this process's state.
                app.containsCycle = true;
                return false;
            }
        }
@@ -23066,6 +23067,7 @@ public class ActivityManagerService extends IActivityManager.Stub
        final int logUid = mCurOomAdjUid;
        int prevAppAdj = app.curAdj;
        int prevProcState = app.curProcState;
        if (app.maxAdj <= ProcessList.FOREGROUND_APP_ADJ) {
            // The max adjustment doesn't allow this app to be anything
@@ -23544,12 +23546,17 @@ public class ActivityManagerService extends IActivityManager.Stub
                        ProcessRecord client = cr.binding.client;
                        computeOomAdjLocked(client, cachedAdj, TOP_APP, doingAll, now);
                        if (client.containsCycle) {
                            // We've detected a cycle. We should ignore this connection and allow
                            // this process to retry computeOomAdjLocked later in case a later-checked
                            // connection from a client  would raise its priority legitimately.
                            // We've detected a cycle. We should retry computeOomAdjLocked later in
                            // case a later-checked connection from a client  would raise its
                            // priority legitimately.
                            app.containsCycle = true;
                            // If the client has not been completely evaluated, skip using its
                            // priority. Else use the conservative value for now and look for a
                            // better state in the next iteration.
                            if (client.completedAdjSeq < mAdjSeq) {
                                continue;
                            }
                        }
                        int clientAdj = client.curRawAdj;
                        int clientProcState = client.curProcState;
                        if (clientProcState >= ActivityManager.PROCESS_STATE_CACHED_ACTIVITY) {
@@ -23771,12 +23778,17 @@ public class ActivityManagerService extends IActivityManager.Stub
                }
                computeOomAdjLocked(client, cachedAdj, TOP_APP, doingAll, now);
                if (client.containsCycle) {
                    // We've detected a cycle. We should ignore this connection and allow
                    // this process to retry computeOomAdjLocked later in case a later-checked
                    // connection from a client  would raise its priority legitimately.
                    // We've detected a cycle. We should retry computeOomAdjLocked later in
                    // case a later-checked connection from a client  would raise its
                    // priority legitimately.
                    app.containsCycle = true;
                    // If the client has not been completely evaluated, skip using its
                    // priority. Else use the conservative value for now and look for a
                    // better state in the next iteration.
                    if (client.completedAdjSeq < mAdjSeq) {
                        continue;
                    }
                }
                int clientAdj = client.curRawAdj;
                int clientProcState = client.curProcState;
                if (clientProcState >= ActivityManager.PROCESS_STATE_CACHED_ACTIVITY) {
@@ -24007,8 +24019,8 @@ public class ActivityManagerService extends IActivityManager.Stub
        app.foregroundActivities = foregroundActivities;
        app.completedAdjSeq = mAdjSeq;
        // if curAdj is less than prevAppAdj, then this process was promoted
        return app.curAdj < prevAppAdj;
        // if curAdj or curProcState improved, then this process was promoted
        return app.curAdj < prevAppAdj || app.curProcState < prevProcState;
    }
    /**
@@ -25061,7 +25073,7 @@ public class ActivityManagerService extends IActivityManager.Stub
        // - Continue retrying until no process was promoted.
        // - Iterate from least important to most important.
        int cycleCount = 0;
        while (retryCycles) {
        while (retryCycles && cycleCount < 10) {
            cycleCount++;
            retryCycles = false;
@@ -25076,12 +25088,14 @@ public class ActivityManagerService extends IActivityManager.Stub
            for (int i=0; i<N; i++) {
                ProcessRecord app = mLruProcesses.get(i);
                if (!app.killedByAm && app.thread != null && app.containsCycle == true) {
                    if (computeOomAdjLocked(app, ProcessList.UNKNOWN_ADJ, TOP_APP, true, now)) {
                        retryCycles = true;
                    }
                }
            }
        }
        for (int i=N-1; i>=0; i--) {
            ProcessRecord app = mLruProcesses.get(i);
            if (!app.killedByAm && app.thread != null) {