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

Commit 088649ae authored by Michael Wachenschwanz's avatar Michael Wachenschwanz
Browse files

Automatically trigger OomAdjuster updates for Backup

Coincidentally this will also fix the out of order update triggering in
the Backup stop path.

Flag: com.android.server.am.push_global_state_to_oomadjuster
Flag: com.android.server.am.auto_trigger_oomadj_updates
Fixes: 369300367
Bug: 399666866
Test: atest MockingOomAdjusterTests

Change-Id: Ie784387a4afa871dcb79fd304630e36dc7e9521e
parent a36f5b8e
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -14189,8 +14189,12 @@ public class ActivityManagerService extends IActivityManager.Stub
            proc.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_BACKUP);
            if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) {
                // Do nothing, ProcessStateController will handle the update in setBackupTarget.
            } else {
                // Try not to kill the process during backup
                updateOomAdjLocked(proc, OOM_ADJ_REASON_BACKUP);
            }
            // If the process is already attached, schedule the creation of the backup agent now.
            // If it is not yet live, this will be done when it attaches to the framework.
@@ -14316,9 +14320,15 @@ public class ActivityManagerService extends IActivityManager.Stub
                // Not backing this app up any more; reset its OOM adjustment
                final ProcessRecord proc = backupTarget.app;
                if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) {
                    // Do nothing.
                    // ProcessStateController will handle the update in stopBackupTarget.
                } else {
                    // TODO(b/369300367): Triggering the update before the state is actually set
                    //  seems wrong.
                    updateOomAdjLocked(proc, OOM_ADJ_REASON_BACKUP);
                }
                proc.setInFullBackup(false);
                proc.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_BACKUP);
+17 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
package com.android.server.am;

import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_ACTIVITY;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_BACKUP;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_SERVICE_BINDER_CALL;
import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER;

@@ -108,7 +109,7 @@ public class ProcessStateController {
     * Add a process to evaluated the next time an update is run.
     */
    @GuardedBy("mLock")
    public void enqueueUpdateTarget(@NonNull ProcessRecord proc) {
    public void enqueueUpdateTarget(@Nullable ProcessRecord proc) {
        mOomAdjuster.enqueueOomAdjTargetLocked(proc);
    }

@@ -313,7 +314,15 @@ public class ProcessStateController {
     */
    @GuardedBy("mLock")
    public void setBackupTarget(@NonNull ProcessRecord proc, @UserIdInt int userId) {
        final ProcessRecord prev = mGlobalState.mBackupTargets.get(userId);
        if (prev == proc) return;
        mGlobalState.mBackupTargets.put(userId, proc);

        if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) {
            enqueueUpdateTarget(prev);
            enqueueUpdateTarget(proc);
            runPendingUpdate(OOM_ADJ_REASON_BACKUP);
        }
    }

    /**
@@ -321,7 +330,13 @@ public class ProcessStateController {
     */
    @GuardedBy("mLock")
    public void stopBackupTarget(@UserIdInt int userId) {
        mGlobalState.mBackupTargets.delete(userId);
        final ProcessRecord prev = mGlobalState.mBackupTargets.removeReturnOld(userId);
        if (prev == null) return;

        if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) {
            enqueueUpdateTarget(prev);
            runPendingUpdate(OOM_ADJ_REASON_BACKUP);
        }
    }

    /**
+34 −8
Original line number Diff line number Diff line
@@ -1575,14 +1575,28 @@ public class MockingOomAdjusterTests {
    public void testUpdateOomAdj_DoOne_Backup() {
        ProcessRecord app = makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID, MOCKAPP_PROCESSNAME,
                MOCKAPP_PACKAGENAME, true);
        setBackupTarget(app);
        setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
        setBackupTarget(app);
        if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) {
            // Do not manually run the update.
        } else {
            updateOomAdj(app);
        doReturn(null).when(mService.mBackupTargets).get(anyInt());

        }
        assertProcStates(app, PROCESS_STATE_TRANSIENT_BACKGROUND, BACKUP_APP_ADJ,
                SCHED_GROUP_BACKGROUND);
        assertThatProcess(app).hasImplicitCpuTimeCapability();

        stopBackupTarget(app.userId);
        if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) {
            // Do not manually run the update.
        } else {
            updateOomAdj(app);
        }
        final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ
                ? sFirstUiCachedAdj : sFirstCachedAdj;
        assertProcStates(app, PROCESS_STATE_CACHED_EMPTY, expectedAdj,
                SCHED_GROUP_BACKGROUND);
        assertThatProcess(app).notHasImplicitCpuTimeCapability();
    }

    @SuppressWarnings("GuardedBy")
@@ -4458,17 +4472,20 @@ public class MockingOomAdjusterTests {

    private ProcessRecord makeDefaultProcessRecord(int pid, int uid, String processName,
            String packageName, boolean hasShownUi) {
        return new ProcessRecordBuilder(pid, uid, processName, packageName).setHasShownUi(
                hasShownUi).build();
        final ProcessRecord proc = new ProcessRecordBuilder(pid, uid, processName,
                packageName).setHasShownUi(hasShownUi).build();
        updateProcessLru(proc);
        return proc;
    }

    private ProcessRecord makeSpiedProcessRecord(int pid, int uid, String processName,
            String packageName, boolean hasShownUi) {
        final ProcessRecord proc = spy(
                makeDefaultProcessRecord(pid, uid, processName, packageName, hasShownUi));
        final ProcessRecord proc = spy(new ProcessRecordBuilder(pid, uid, processName,
                packageName).setHasShownUi(hasShownUi).build());
        final WindowProcessController wpc = proc.getWindowProcessController();
        // Need to overwrite the WindowProcessController.mOwner with the new spy object
        setFieldValue(WindowProcessController.class, wpc, "mOwner", proc);
        updateProcessLru(proc);
        return proc;
    }

@@ -4628,6 +4645,15 @@ public class MockingOomAdjusterTests {
        }
    }

    @SuppressWarnings("GuardedBy")
    private void stopBackupTarget(int userId) {
        if (Flags.pushGlobalStateToOomadjuster()) {
            mProcessStateController.stopBackupTarget(userId);
        } else {
            doReturn(null).when(mService.mBackupTargets).get(anyInt());
        }
    }

    private void setHasActivity(WindowProcessController wpc, boolean hasActivity) {
        if (Flags.pushActivityStateToOomadjuster()) {
            mActivityStateAsyncUpdater.setHasActivityAsync(wpc, hasActivity);