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:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user