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

Commit 65a646ae authored by Edgar Arriaga García's avatar Edgar Arriaga García Committed by Android (Google) Code Review
Browse files

Merge changes If2614951,I677af7bf into udc-dev

* changes:
  Remove wasteful bfgs and services compaction flows
  Make compaction happen after freezing
parents 2e03f9f5 0bf0398e
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -1095,7 +1095,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
                synchronized (mInternal.mProcLock) {
                    mInternal.mOomAdjuster.mCachedAppOptimizer.compactApp(app,
                            CachedAppOptimizer.CompactProfile.FULL,
                            CachedAppOptimizer.CompactSource.APP, true);
                            CachedAppOptimizer.CompactSource.SHELL, true);
                }
                pw.println("Finished full compaction for " + app.mPid);
            } else if (isSomeCompact) {
@@ -1103,7 +1103,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
                synchronized (mInternal.mProcLock) {
                    mInternal.mOomAdjuster.mCachedAppOptimizer.compactApp(app,
                            CachedAppOptimizer.CompactProfile.SOME,
                            CachedAppOptimizer.CompactSource.APP, true);
                            CachedAppOptimizer.CompactSource.SHELL, true);
                }
                pw.println("Finished some compaction for " + app.mPid);
            }
+29 −87
Original line number Diff line number Diff line
@@ -226,8 +226,8 @@ public final class CachedAppOptimizer {
        FULL // File+anon compaction
    }

    // This indicates the process OOM memory state that initiated the compaction request
    public enum CompactSource { APP, PERSISTENT, BFGS }
    // This indicates who initiated the compaction request
    public enum CompactSource { APP, SHELL }

    public enum CancelCompactReason {
        SCREEN_ON, // screen was turned on which cancels all compactions.
@@ -373,10 +373,6 @@ public final class CachedAppOptimizer {
    @GuardedBy("mPhenotypeFlagLock")
    @VisibleForTesting volatile long mCompactThrottleFullFull = DEFAULT_COMPACT_THROTTLE_4;
    @GuardedBy("mPhenotypeFlagLock")
    @VisibleForTesting volatile long mCompactThrottleBFGS = DEFAULT_COMPACT_THROTTLE_5;
    @GuardedBy("mPhenotypeFlagLock")
    @VisibleForTesting volatile long mCompactThrottlePersistent = DEFAULT_COMPACT_THROTTLE_6;
    @GuardedBy("mPhenotypeFlagLock")
    @VisibleForTesting volatile long mCompactThrottleMinOomAdj =
            DEFAULT_COMPACT_THROTTLE_MIN_OOM_ADJ;
    @GuardedBy("mPhenotypeFlagLock")
@@ -635,8 +631,6 @@ public final class CachedAppOptimizer {
            pw.println("  " + KEY_COMPACT_THROTTLE_2 + "=" + mCompactThrottleSomeFull);
            pw.println("  " + KEY_COMPACT_THROTTLE_3 + "=" + mCompactThrottleFullSome);
            pw.println("  " + KEY_COMPACT_THROTTLE_4 + "=" + mCompactThrottleFullFull);
            pw.println("  " + KEY_COMPACT_THROTTLE_5 + "=" + mCompactThrottleBFGS);
            pw.println("  " + KEY_COMPACT_THROTTLE_6 + "=" + mCompactThrottlePersistent);
            pw.println("  " + KEY_COMPACT_THROTTLE_MIN_OOM_ADJ + "=" + mCompactThrottleMinOomAdj);
            pw.println("  " + KEY_COMPACT_THROTTLE_MAX_OOM_ADJ + "=" + mCompactThrottleMaxOomAdj);
            pw.println("  " + KEY_COMPACT_STATSD_SAMPLE_RATE + "=" + mCompactStatsdSampleRate);
@@ -728,32 +722,6 @@ public final class CachedAppOptimizer {
        }
    }

    // This method returns true only if requirements are met. Note, that requirements are different
    // from throttles applied at the time a compaction is trying to be executed in the sense that
    // these are not subject to change dependent on time or memory as throttles usually do.
    @GuardedBy("mProcLock")
    boolean meetsCompactionRequirements(ProcessRecord proc) {
        if (mAm.mInternal.isPendingTopUid(proc.uid)) {
            // In case the OOM Adjust has not yet been propagated we see if this is
            // pending on becoming top app in which case we should not compact.
            if (DEBUG_COMPACTION) {
                Slog.d(TAG_AM, "Skip compaction since UID is active for  " + proc.processName);
            }
            return false;
        }

        if (proc.mState.hasForegroundActivities()) {
            if (DEBUG_COMPACTION) {
                Slog.e(TAG_AM,
                        "Skip compaction as process " + proc.processName
                                + " has foreground activities");
            }
            return false;
        }

        return true;
    }

    @GuardedBy("mProcLock")
    boolean compactApp(
            ProcessRecord app, CompactProfile compactProfile, CompactSource source, boolean force) {
@@ -777,7 +745,7 @@ public final class CachedAppOptimizer {
                return false;
        }

        if (!app.mOptRecord.hasPendingCompact() && (meetsCompactionRequirements(app) || force)) {
        if (!app.mOptRecord.hasPendingCompact()) {
            final String processName = (app.processName != null ? app.processName : "");
            if (DEBUG_COMPACTION) {
                Slog.d(TAG_AM,
@@ -795,8 +763,7 @@ public final class CachedAppOptimizer {
        if (DEBUG_COMPACTION) {
            Slog.d(TAG_AM,
                    " compactApp Skipped for " + app.processName + " pendingCompact= "
                            + app.mOptRecord.hasPendingCompact() + " meetsCompactionRequirements="
                            + meetsCompactionRequirements(app) + ". Requested compact profile: "
                            + app.mOptRecord.hasPendingCompact() + ". Requested compact profile: "
                            + app.mOptRecord.getReqCompactProfile().name() + ". Compact source "
                            + app.mOptRecord.getReqCompactSource().name());
        }
@@ -831,18 +798,6 @@ public final class CachedAppOptimizer {
        return stats;
    }

    @GuardedBy("mProcLock")
    boolean shouldCompactPersistent(ProcessRecord app, long now) {
        return (app.mOptRecord.getLastCompactTime() == 0
                || (now - app.mOptRecord.getLastCompactTime()) > mCompactThrottlePersistent);
    }

    @GuardedBy("mProcLock")
    boolean shouldCompactBFGS(ProcessRecord app, long now) {
        return (app.mOptRecord.getLastCompactTime() == 0
                || (now - app.mOptRecord.getLastCompactTime()) > mCompactThrottleBFGS);
    }

    void compactAllSystem() {
        if (useCompaction()) {
            if (DEBUG_COMPACTION) {
@@ -1130,8 +1085,6 @@ public final class CachedAppOptimizer {
                mCompactThrottleSomeFull = Integer.parseInt(throttleSomeFullFlag);
                mCompactThrottleFullSome = Integer.parseInt(throttleFullSomeFlag);
                mCompactThrottleFullFull = Integer.parseInt(throttleFullFullFlag);
                mCompactThrottleBFGS = Integer.parseInt(throttleBFGSFlag);
                mCompactThrottlePersistent = Integer.parseInt(throttlePersistentFlag);
                mCompactThrottleMinOomAdj = Long.parseLong(throttleMinOomAdjFlag);
                mCompactThrottleMaxOomAdj = Long.parseLong(throttleMaxOomAdjFlag);
            } catch (NumberFormatException e) {
@@ -1144,8 +1097,6 @@ public final class CachedAppOptimizer {
            mCompactThrottleSomeFull = DEFAULT_COMPACT_THROTTLE_2;
            mCompactThrottleFullSome = DEFAULT_COMPACT_THROTTLE_3;
            mCompactThrottleFullFull = DEFAULT_COMPACT_THROTTLE_4;
            mCompactThrottleBFGS = DEFAULT_COMPACT_THROTTLE_5;
            mCompactThrottlePersistent = DEFAULT_COMPACT_THROTTLE_6;
            mCompactThrottleMinOomAdj = DEFAULT_COMPACT_THROTTLE_MIN_OOM_ADJ;
            mCompactThrottleMaxOomAdj = DEFAULT_COMPACT_THROTTLE_MAX_OOM_ADJ;
        }
@@ -1497,23 +1448,23 @@ public final class CachedAppOptimizer {

    @GuardedBy({"mService", "mProcLock"})
    void onOomAdjustChanged(int oldAdj, int newAdj, ProcessRecord app) {
        if (useCompaction()) {
            // Cancel any currently executing compactions
            // if the process moved out of cached state
            if (newAdj < oldAdj && newAdj < ProcessList.CACHED_APP_MIN_ADJ) {
                cancelCompactionForProcess(app, CancelCompactReason.OOM_IMPROVEMENT);
            }
        }
    }

        if (oldAdj <= ProcessList.PERCEPTIBLE_APP_ADJ
                && (newAdj == ProcessList.PREVIOUS_APP_ADJ || newAdj == ProcessList.HOME_APP_ADJ)) {
            if (ENABLE_FILE_COMPACT) {
                // Perform a minor compaction when a perceptible app becomes the prev/home app
                compactApp(app, CompactProfile.SOME, CompactSource.APP, false);
    /**
     * Callback received after a process has been frozen.
     */
    void onProcessFrozen(ProcessRecord frozenProc) {
        if (useCompaction()) {
            synchronized (mProcLock) {
                compactApp(frozenProc, CompactProfile.FULL, CompactSource.APP, false);
            }
        } else if (oldAdj < ProcessList.CACHED_APP_MIN_ADJ
                && newAdj >= ProcessList.CACHED_APP_MIN_ADJ
                && newAdj <= ProcessList.CACHED_APP_MAX_ADJ) {
            // Perform a major compaction when any app enters cached
            compactApp(app, CompactProfile.FULL, CompactSource.APP, false);
        }
    }

@@ -1687,26 +1638,6 @@ public final class CachedAppOptimizer {
                            return true;
                        }
                    }
                } else if (source == CompactSource.PERSISTENT) {
                    if (start - lastCompactTime < mCompactThrottlePersistent) {
                        if (DEBUG_COMPACTION) {
                            Slog.d(TAG_AM,
                                    "Skipping persistent compaction for " + name
                                            + ": too soon. throttle=" + mCompactThrottlePersistent
                                            + " last=" + (start - lastCompactTime) + "ms ago");
                        }
                        return true;
                    }
                } else if (source == CompactSource.BFGS) {
                    if (start - lastCompactTime < mCompactThrottleBFGS) {
                        if (DEBUG_COMPACTION) {
                            Slog.d(TAG_AM,
                                    "Skipping bfgs compaction for " + name
                                            + ": too soon. throttle=" + mCompactThrottleBFGS
                                            + " last=" + (start - lastCompactTime) + "ms ago");
                        }
                        return true;
                    }
                }
            }

@@ -2021,6 +1952,9 @@ public final class CachedAppOptimizer {
                            }
                        }
                    }
                    if (proc.mOptRecord.isFrozen()) {
                        onProcessFrozen(proc);
                    }
                }
                    break;
                case REPORT_UNFREEZE_MSG:
@@ -2050,6 +1984,10 @@ public final class CachedAppOptimizer {
            freezeAppAsyncLSP(proc);
        }

        /**
         * Freeze a process.
         * @param proc process to be frozen
         */
        @GuardedBy({"mAm"})
        private void freezeProcess(final ProcessRecord proc) {
            int pid = proc.getPid(); // Unlocked intentionally
@@ -2083,6 +2021,10 @@ public final class CachedAppOptimizer {
                if (pid == 0 || opt.isFrozen()) {
                    // Already frozen or not a real process, either one being
                    // launched or one being killed
                    if (DEBUG_FREEZER) {
                        Slog.d(TAG_AM, "Skipping freeze for process " + pid
                                + " " + name + ". Already frozen or not a real process");
                    }
                    return;
                }

+2 −24
Original line number Diff line number Diff line
@@ -2937,30 +2937,8 @@ public class OomAdjuster {

        int changes = 0;

        // don't compact during bootup
        if (mCachedAppOptimizer.useCompaction() && mService.mBooted) {
            // Cached and prev/home compaction
            // reminder: here, setAdj is previous state, curAdj is upcoming state
        if (state.getCurAdj() != state.getSetAdj()) {
            mCachedAppOptimizer.onOomAdjustChanged(state.getSetAdj(), state.getCurAdj(), app);
            } else if (mService.mWakefulness.get() != PowerManagerInternal.WAKEFULNESS_AWAKE) {
                // See if we can compact persistent and bfgs services now that screen is off
                if (state.getSetAdj() < FOREGROUND_APP_ADJ
                        && !state.isRunningRemoteAnimation()
                        // Because these can fire independent of oom_adj/procstate changes, we need
                        // to throttle the actual dispatch of these requests in addition to the
                        // processing of the requests. As a result, there is throttling both here
                        // and in CachedAppOptimizer.
                        && mCachedAppOptimizer.shouldCompactPersistent(app, now)) {
                    mCachedAppOptimizer.compactApp(app, CachedAppOptimizer.CompactProfile.FULL,
                            CachedAppOptimizer.CompactSource.PERSISTENT, false);
                } else if (state.getCurProcState()
                                == ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
                        && mCachedAppOptimizer.shouldCompactBFGS(app, now)) {
                    mCachedAppOptimizer.compactApp(app, CachedAppOptimizer.CompactProfile.FULL,
                            CachedAppOptimizer.CompactSource.BFGS, false);
                }
            }
        }

        if (state.getCurAdj() != state.getSetAdj()) {
+1 −49
Original line number Diff line number Diff line
@@ -166,10 +166,6 @@ public final class CachedAppOptimizerTest {
                    CachedAppOptimizer.DEFAULT_STATSD_SAMPLE_RATE);
            assertThat(mCachedAppOptimizerUnderTest.mFreezerStatsdSampleRate).isEqualTo(
                    CachedAppOptimizer.DEFAULT_STATSD_SAMPLE_RATE);
            assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
                    CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5);
            assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
                    CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6);
            assertThat(mCachedAppOptimizerUnderTest.mFullAnonRssThrottleKb).isEqualTo(
                    CachedAppOptimizer.DEFAULT_COMPACT_FULL_RSS_THROTTLE_KB);
            assertThat(mCachedAppOptimizerUnderTest.mFullDeltaRssThrottleKb).isEqualTo(
@@ -261,10 +257,6 @@ public final class CachedAppOptimizerTest {
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3 + 1);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4 + 1);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5 + 1);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6 + 1);
        assertThat(mCachedAppOptimizerUnderTest.mFullDeltaRssThrottleKb).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_FULL_DELTA_RSS_THROTTLE_KB + 1);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleMinOomAdj).isEqualTo(
@@ -275,10 +267,6 @@ public final class CachedAppOptimizerTest {
                CachedAppOptimizer.DEFAULT_STATSD_SAMPLE_RATE + 0.1f);
        assertThat(mCachedAppOptimizerUnderTest.mFreezerStatsdSampleRate).isEqualTo(
                CachedAppOptimizer.DEFAULT_STATSD_SAMPLE_RATE + 0.1f);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5 + 1);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6 + 1);
        assertThat(mCachedAppOptimizerUnderTest.mFullAnonRssThrottleKb).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_FULL_RSS_THROTTLE_KB + 1);
        assertThat(mCachedAppOptimizerUnderTest.mProcStateThrottle).containsExactly(1, 2, 3);
@@ -425,10 +413,6 @@ public final class CachedAppOptimizerTest {
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3 + 1);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4 + 1);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5 + 1);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6 + 1);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleMinOomAdj).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_MIN_OOM_ADJ + 1);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleMaxOomAdj).isEqualTo(
@@ -454,10 +438,6 @@ public final class CachedAppOptimizerTest {
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6);

        // Repeat for each of the throttle keys.
        mCountDown = new CountDownLatch(1);
@@ -472,10 +452,6 @@ public final class CachedAppOptimizerTest {
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6);

        mCountDown = new CountDownLatch(1);
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
@@ -489,10 +465,6 @@ public final class CachedAppOptimizerTest {
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6);

        mCountDown = new CountDownLatch(1);
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
@@ -506,10 +478,6 @@ public final class CachedAppOptimizerTest {
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6);

        mCountDown = new CountDownLatch(1);
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
@@ -523,10 +491,6 @@ public final class CachedAppOptimizerTest {
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6);

        mCountDown = new CountDownLatch(1);
        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
@@ -540,10 +504,6 @@ public final class CachedAppOptimizerTest {
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5);
        assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo(
                CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6);
    }

    @Test
@@ -953,15 +913,7 @@ public final class CachedAppOptimizerTest {
        mProcessDependencies.setRssAfterCompaction(rssAfter);

        // When moving within cached state
        mCachedAppOptimizerUnderTest.onOomAdjustChanged(
                ProcessList.CACHED_APP_MIN_ADJ, ProcessList.CACHED_APP_MIN_ADJ + 1, processRecord);
        waitForHandler();
        // THEN process IS NOT compacted.
        assertThat(mCachedAppOptimizerUnderTest.mLastCompactionStats.get(pid)).isNull();

        // When moving into cached state
        mCachedAppOptimizerUnderTest.onOomAdjustChanged(ProcessList.CACHED_APP_MIN_ADJ - 1,
                ProcessList.CACHED_APP_MIN_ADJ + 1, processRecord);
        mCachedAppOptimizerUnderTest.onProcessFrozen(processRecord);
        waitForHandler();
        // THEN process IS compacted.
        assertThat(mCachedAppOptimizerUnderTest.mLastCompactionStats.get(pid)).isNotNull();