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
This commit is contained in:
Tim Murray
2023-02-10 17:08:04 -08:00
parent 326c51d79b
commit f760f7f10d

View File

@@ -1921,9 +1921,26 @@ 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((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 @@ public final class CachedAppOptimizer {
}
});
}
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 @@ public final class CachedAppOptimizer {
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;
}
}
}
}