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
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user