Merge "Don't allow bg traffic to stall urgent traffic"

This commit is contained in:
TreeHugger Robot
2022-11-17 20:48:52 +00:00
committed by Android (Google) Code Review
3 changed files with 58 additions and 4 deletions

View File

@@ -136,14 +136,23 @@ public class BroadcastConstants {
private static final boolean DEFAULT_MODERN_QUEUE_ENABLED = true;
/**
* For {@link BroadcastQueueModernImpl}: Maximum number of process queues to
* dispatch broadcasts to simultaneously.
* For {@link BroadcastQueueModernImpl}: Maximum dispatch parallelism
* that we'll tolerate for ordinary broadcast dispatch.
*/
public int MAX_RUNNING_PROCESS_QUEUES = DEFAULT_MAX_RUNNING_PROCESS_QUEUES;
private static final String KEY_MAX_RUNNING_PROCESS_QUEUES = "bcast_max_running_process_queues";
private static final int DEFAULT_MAX_RUNNING_PROCESS_QUEUES =
ActivityManager.isLowRamDeviceStatic() ? 2 : 4;
/**
* For {@link BroadcastQueueModernImpl}: Additional running process queue parallelism beyond
* {@link #MAX_RUNNING_PROCESS_QUEUES} for dispatch of "urgent" broadcasts.
*/
public int EXTRA_RUNNING_URGENT_PROCESS_QUEUES = DEFAULT_EXTRA_RUNNING_URGENT_PROCESS_QUEUES;
private static final String KEY_EXTRA_RUNNING_URGENT_PROCESS_QUEUES =
"bcast_extra_running_urgent_process_queues";
private static final int DEFAULT_EXTRA_RUNNING_URGENT_PROCESS_QUEUES = 1;
/**
* For {@link BroadcastQueueModernImpl}: Maximum number of active broadcasts
* to dispatch to a "running" process queue before we retire them back to
@@ -250,6 +259,10 @@ public class BroadcastConstants {
updateDeviceConfigConstants();
}
public int getMaxRunningQueues() {
return MAX_RUNNING_PROCESS_QUEUES + EXTRA_RUNNING_URGENT_PROCESS_QUEUES;
}
private void updateSettingsConstants() {
synchronized (this) {
try {
@@ -317,6 +330,9 @@ public class BroadcastConstants {
DEFAULT_MODERN_QUEUE_ENABLED);
MAX_RUNNING_PROCESS_QUEUES = getDeviceConfigInt(KEY_MAX_RUNNING_PROCESS_QUEUES,
DEFAULT_MAX_RUNNING_PROCESS_QUEUES);
EXTRA_RUNNING_URGENT_PROCESS_QUEUES = getDeviceConfigInt(
KEY_EXTRA_RUNNING_URGENT_PROCESS_QUEUES,
DEFAULT_EXTRA_RUNNING_URGENT_PROCESS_QUEUES);
MAX_RUNNING_ACTIVE_BROADCASTS = getDeviceConfigInt(KEY_MAX_RUNNING_ACTIVE_BROADCASTS,
DEFAULT_MAX_RUNNING_ACTIVE_BROADCASTS);
MAX_PENDING_BROADCASTS = getDeviceConfigInt(KEY_MAX_PENDING_BROADCASTS,

View File

@@ -583,6 +583,14 @@ class BroadcastProcessQueue {
return mCountManifest > 0;
}
/**
* Report whether this queue is currently handling an urgent broadcast.
*/
public boolean isPendingUrgent() {
BroadcastRecord next = peekNextBroadcastRecord();
return (next != null) ? next.isUrgent() : false;
}
/**
* Quickly determine if this queue has broadcasts that are still waiting to
* be delivered at some point in the future.

View File

@@ -138,7 +138,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
// We configure runnable size only once at boot; it'd be too complex to
// try resizing dynamically at runtime
mRunning = new BroadcastProcessQueue[mConstants.MAX_RUNNING_PROCESS_QUEUES];
mRunning = new BroadcastProcessQueue[mConstants.getMaxRunningQueues()];
}
/**
@@ -292,6 +292,19 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
return size;
}
/**
* Return the number of active queues that are delivering "urgent" broadcasts
*/
private int getRunningUrgentCount() {
int count = 0;
for (int i = 0; i < mRunning.length; i++) {
if (mRunning[i] != null && mRunning[i].getActive().isUrgent()) {
count++;
}
}
return count;
}
/**
* Return the first index of the given value contained inside
* {@link #mRunning}, otherwise {@code -1}.
@@ -356,7 +369,15 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
*/
@GuardedBy("mService")
private void updateRunningListLocked() {
int avail = mRunning.length - getRunningSize();
// Allocated size here implicitly includes the extra reservation for urgent
// dispatches beyond the MAX_RUNNING_QUEUES soft limit for normal
// parallelism. If we're already dispatching some urgent broadcasts,
// count that against the extra first - its role is to permit progress of
// urgent broadcast traffic when the normal reservation is fully occupied
// with less-urgent dispatches, not to generally expand parallelism.
final int usedExtra = Math.min(getRunningUrgentCount(),
mConstants.EXTRA_RUNNING_URGENT_PROCESS_QUEUES);
int avail = mRunning.length - getRunningSize() - usedExtra;
if (avail == 0) return;
final int cookie = traceBegin("updateRunningList");
@@ -382,6 +403,15 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
continue;
}
// If we've hit the soft limit for non-urgent dispatch parallelism,
// only consider delivering from queues whose ready broadcast is urgent
if (getRunningSize() >= mConstants.MAX_RUNNING_PROCESS_QUEUES) {
if (!queue.isPendingUrgent()) {
queue = nextQueue;
continue;
}
}
// If queues beyond this point aren't ready to run yet, schedule
// another pass when they'll be runnable
if (runnableAt > now && !waitingFor) {