summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Li Li <dualli@google.com> 2023-04-03 15:41:05 -0700
committer Li Li <dualli@google.com> 2023-04-04 17:33:19 +0000
commit7bcf8f1d6b15ec4391f1019f14e6df9fbe33584e (patch)
treebd1a23d7874c97d45c0115a1fa477d30f863b1e2
parent1731a50bef2d989bdac26f446a72430b2b800dba (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.java34
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;