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

Commit 7bcf8f1d authored by Li Li's avatar Li Li
Browse files

Optimize Freezer deadlock detection

After removing MCP limitation, there could be much more apps cached in
the memmory. The overhead to check /proc/locks for each proces also
increases, causing more lock contentions.

Optimize it by checking /proc/locks once for adjacent freeze operations.

Bug: 276802031
Test: Check logcat and inotifyd /proc/locks
Change-Id: Ia65bb9d180c05d7ce2ff6a6382408c7e4eea2f4b
parent 1731a50b
Loading
Loading
Loading
Loading
+16 −18
Original line number Diff line number Diff line
@@ -175,6 +175,7 @@ public final class CachedAppOptimizer {
    private static final String ATRACE_FREEZER_TRACK = "Freezer";

    private static final int FREEZE_BINDER_TIMEOUT_MS = 100;
    private static final int FREEZE_DEADLOCK_TIMEOUT_MS = 1000;

    @VisibleForTesting static final boolean ENABLE_FILE_COMPACT = false;

@@ -241,6 +242,7 @@ public final class CachedAppOptimizer {
    static final int REPORT_UNFREEZE_MSG = 4;
    static final int COMPACT_NATIVE_MSG = 5;
    static final int UID_FROZEN_STATE_CHANGED_MSG = 6;
    static final int DEADLOCK_WATCHDOG_MSG = 7;

    // When free swap falls below this percentage threshold any full (file + anon)
    // compactions will be downgraded to file only compactions to reduce pressure
@@ -1933,28 +1935,14 @@ public final class CachedAppOptimizer {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SET_FROZEN_PROCESS_MSG:
                {
                    ProcessRecord proc = (ProcessRecord) msg.obj;
                    int pid = proc.getPid();
                    final String name = proc.processName;
                    synchronized (mAm) {
                        freezeProcess(proc);
                    }
                    try {
                        // post-check to prevent deadlock
                        mProcLocksReader.handleBlockingFileLocks(this);
                    } catch (Exception e) {
                        Slog.e(TAG_AM, "Unable to check file locks for "
                                + name + "(" + pid + "): " + e);
                        synchronized (mAm) {
                            synchronized (mProcLock) {
                                unfreezeAppLSP(proc, UNFREEZE_REASON_FILE_LOCK_CHECK_FAILURE);
                            }
                        }
                    }
                    if (proc.mOptRecord.isFrozen()) {
                        onProcessFrozen(proc);
                    }
                        removeMessages(DEADLOCK_WATCHDOG_MSG);
                        sendEmptyMessageDelayed(DEADLOCK_WATCHDOG_MSG, FREEZE_DEADLOCK_TIMEOUT_MS);
                    }
                    break;
                case REPORT_UNFREEZE_MSG:
@@ -1967,8 +1955,18 @@ public final class CachedAppOptimizer {
                    reportUnfreeze(pid, frozenDuration, processName, reason);
                    break;
                case UID_FROZEN_STATE_CHANGED_MSG:
                    ProcessRecord proc = (ProcessRecord) msg.obj;
                    reportOneUidFrozenStateChanged(proc.uid, true);
                    reportOneUidFrozenStateChanged(((ProcessRecord) msg.obj).uid, true);
                    break;
                case DEADLOCK_WATCHDOG_MSG:
                    try {
                        // post-check to prevent deadlock
                        if (DEBUG_FREEZER) {
                            Slog.d(TAG_AM, "Freezer deadlock watchdog");
                        }
                        mProcLocksReader.handleBlockingFileLocks(this);
                    } catch (IOException e) {
                        Slog.w(TAG_AM, "Unable to check file locks");
                    }
                    break;
                default:
                    return;