diff options
| author | 2023-04-03 15:41:05 -0700 | |
|---|---|---|
| committer | 2023-04-04 17:33:19 +0000 | |
| commit | 7bcf8f1d6b15ec4391f1019f14e6df9fbe33584e (patch) | |
| tree | bd1a23d7874c97d45c0115a1fa477d30f863b1e2 | |
| parent | 1731a50bef2d989bdac26f446a72430b2b800dba (diff) | |
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
| -rw-r--r-- | services/core/java/com/android/server/am/CachedAppOptimizer.java | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 9c1546324e4b..dda61c32ba40 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -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,29 +1935,15 @@ 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: int pid = msg.arg1; @@ -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; |