From f760f7f10d26588e52c38fcdf7cb8b68c723c5ad Mon Sep 17 00:00:00 2001 From: Tim Murray Date: Fri, 10 Feb 2023 17:08:04 -0800 Subject: [PATCH] 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 --- .../android/server/am/CachedAppOptimizer.java | 64 +++++++++++-------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 913f151496467..f4685f0f6125f 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 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; + } } } }