From 5564cddbd70a3745e516c39f5299de3886fdf936 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Fri, 28 Oct 2022 14:47:06 -0600 Subject: [PATCH] BroadcastQueue: fix subtle OOM adjustment bug. updateOomAdjPendingTargetsLocked() only takes effect for processes that are already running as warm; it doesn't work on a process that is still being cold started. This change fixes the bug by making an explicit update call once a pending cold start has become a warm process. Bug: 255985948 Test: atest CtsAppTestCases:ActivityManagerProcessStateTest#testBackgroundCheckBroadcastService Change-Id: I7e42984c7b7fd6e496fc9245304f1eff8ad71075 --- .../server/am/BroadcastQueueModernImpl.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java index 9e9eb71db4e52..822294859f3a3 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java @@ -412,21 +412,24 @@ class BroadcastQueueModernImpl extends BroadcastQueue { queue.runningTraceTrackName = TAG + ".mRunning[" + queueIndex + "]"; queue.runningOomAdjusted = queue.isPendingManifest(); + // If already warm, we can make OOM adjust request immediately; + // otherwise we need to wait until process becomes warm + if (processWarm) { + notifyStartedRunning(queue); + updateOomAdj |= queue.runningOomAdjusted; + } + // If we're already warm, schedule next pending broadcast now; // otherwise we'll wait for the cold start to circle back around queue.makeActiveNextPending(); if (processWarm) { queue.traceProcessRunningBegin(); - notifyStartedRunning(queue); scheduleReceiverWarmLocked(queue); } else { queue.traceProcessStartingBegin(); scheduleReceiverColdLocked(queue); } - // Only kick off an OOM adjustment pass if needed - updateOomAdj |= queue.runningOomAdjusted; - // Move to considering next runnable queue queue = nextQueue; } @@ -464,9 +467,13 @@ class BroadcastQueueModernImpl extends BroadcastQueue { // now; dispatch its next broadcast and clear the slot mRunningColdStart = null; + // Now that we're running warm, we can finally request that OOM + // adjust we've been waiting for + notifyStartedRunning(queue); + mService.updateOomAdjPendingTargetsLocked(OOM_ADJ_REASON_START_RECEIVER); + queue.traceProcessEnd(); queue.traceProcessRunningBegin(); - notifyStartedRunning(queue); scheduleReceiverWarmLocked(queue); // We might be willing to kick off another cold start