Freezer: release AM lock while checking /proc/locks
Checking /proc/locks can take a long time if new file locks are being
added. Hoist that outside of the AM lock to make sure that
system_server doesn't stall unnecessarily.
Test: device functions with short freezer timeout
Bug: 269207437
Change-Id: I5bab77281992d0e826427e458025103500fc0869
Merged-in: I5bab77281992d0e826427e458025103500fc0869
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index 913f151..f4685f0 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -1921,9 +1921,26 @@
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((ProcessRecord) msg.obj);
+ 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, OomAdjuster.OOM_ADJ_REASON_NONE);
+ }
+ }
+ }
+ }
break;
case REPORT_UNFREEZE_MSG:
int pid = msg.arg1;
@@ -2057,16 +2074,6 @@
}
});
}
-
- 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 (mProcLock) {
- unfreezeAppLSP(proc, OomAdjuster.OOM_ADJ_REASON_NONE);
- }
- }
}
private void reportUnfreeze(int pid, int frozenDuration, String processName,
@@ -2123,22 +2130,25 @@
if (DEBUG_FREEZER) {
Slog.d(TAG_AM, "Blocking file lock found: " + pids);
}
- synchronized (mProcLock) {
- int pid = pids.get(0);
- ProcessRecord app = mFrozenProcesses.get(pid);
- ProcessRecord pr;
- if (app != null) {
- for (int i = 1; i < pids.size(); i++) {
- int blocked = pids.get(i);
- synchronized (mAm.mPidsSelfLocked) {
- pr = mAm.mPidsSelfLocked.get(blocked);
- }
- if (pr != null && pr.mState.getCurAdj() < ProcessList.CACHED_APP_MIN_ADJ) {
- Slog.d(TAG_AM, app.processName + " (" + pid + ") blocks "
- + pr.processName + " (" + blocked + ")");
- // Found at least one blocked non-cached process
- unfreezeAppLSP(app, OomAdjuster.OOM_ADJ_REASON_NONE);
- break;
+ synchronized (mAm) {
+ synchronized (mProcLock) {
+ int pid = pids.get(0);
+ ProcessRecord app = mFrozenProcesses.get(pid);
+ ProcessRecord pr;
+ if (app != null) {
+ for (int i = 1; i < pids.size(); i++) {
+ int blocked = pids.get(i);
+ synchronized (mAm.mPidsSelfLocked) {
+ pr = mAm.mPidsSelfLocked.get(blocked);
+ }
+ if (pr != null
+ && pr.mState.getCurAdj() < ProcessList.CACHED_APP_MIN_ADJ) {
+ Slog.d(TAG_AM, app.processName + " (" + pid + ") blocks "
+ + pr.processName + " (" + blocked + ")");
+ // Found at least one blocked non-cached process
+ unfreezeAppLSP(app, OomAdjuster.OOM_ADJ_REASON_NONE);
+ break;
+ }
}
}
}