summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kweku Adams <kwekua@google.com> 2021-04-08 21:23:07 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-04-08 21:23:07 +0000
commit6fbec6e775595c5ac3593486ba99d802d5d8f8f7 (patch)
treeea9e3b5e45010a148d609236caea7acdb7f51c58
parent44763d1b5b902595a4d2ebef73cdf4565f83e5cb (diff)
parenteb3be08ea374655101856895c3f25c66ed8355b4 (diff)
Merge "Improve UID ordering for connectivity callbacks." into sc-dev
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java65
1 files changed, 46 insertions, 19 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
index b4e167a97b4c..081163bdbe79 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
@@ -121,54 +121,81 @@ public final class ConnectivityController extends RestrictingController implemen
private final SparseArray<UidDefaultNetworkCallback> mCurrentDefaultNetworkCallbacks =
new SparseArray<>();
private final Comparator<UidStats> mUidStatsComparator = new Comparator<UidStats>() {
- private int prioritizeExistence(int v1, int v2) {
- if (v1 > 0 && v2 > 0) {
+ private int prioritizeExistenceOver(int threshold, int v1, int v2) {
+ // Check if they're both on the same side of the threshold.
+ if ((v1 > threshold && v2 > threshold) || (v1 <= threshold && v2 <= threshold)) {
return 0;
}
- return v2 - v1;
+ // They're on opposite sides of the threshold.
+ if (v1 > threshold) {
+ return -1;
+ }
+ return 1;
}
@Override
public int compare(UidStats us1, UidStats us2) {
- // TODO: build a better prioritization scheme
- // Some things to use:
- // * Proc state
- // * IMPORTANT_WHILE_IN_FOREGROUND bit
- final int runningPriority = prioritizeExistence(us1.numRunning, us2.numRunning);
+ // Prioritize a UID ahead of another based on:
+ // 1. Already running connectivity jobs (so we don't drop the listener)
+ // 2. Waiting connectivity jobs would be ready with connectivity
+ // 3. An existing network satisfies a waiting connectivity job's requirements
+ // 4. TOP proc state
+ // 5. Existence of treat-as-EJ EJs (not just requested EJs)
+ // 6. FGS proc state
+ // 7. EJ enqueue time
+ // 8. Any other important job priorities/proc states
+ // 9. Enqueue time
+ // TODO: maybe consider number of jobs
+ // TODO: consider IMPORTANT_WHILE_FOREGROUND bit
+ final int runningPriority = prioritizeExistenceOver(0, us1.numRunning, us2.numRunning);
if (runningPriority != 0) {
return runningPriority;
}
// Prioritize any UIDs that have jobs that would be ready ahead of UIDs that don't.
- final int readyWithConnPriority =
- prioritizeExistence(us1.numReadyWithConnectivity, us2.numReadyWithConnectivity);
+ final int readyWithConnPriority = prioritizeExistenceOver(0,
+ us1.numReadyWithConnectivity, us2.numReadyWithConnectivity);
if (readyWithConnPriority != 0) {
return readyWithConnPriority;
}
// They both have jobs that would be ready. Prioritize the UIDs whose requested
// network is available ahead of UIDs that don't have their requested network available.
- final int reqAvailPriority = prioritizeExistence(
+ final int reqAvailPriority = prioritizeExistenceOver(0,
us1.numRequestedNetworkAvailable, us2.numRequestedNetworkAvailable);
if (reqAvailPriority != 0) {
return reqAvailPriority;
}
- // They both have jobs with available networks. Prioritize based on:
- // 1. (eventually) proc state
- // 2. Existence of runnable EJs (not just requested)
- // 3. Enqueue time
- // TODO: maybe consider number of jobs
- final int ejPriority = prioritizeExistence(us1.numEJs, us2.numEJs);
+ // Prioritize the top app. If neither are top apps, then use a later prioritization
+ // check.
+ final int topPriority = prioritizeExistenceOver(JobInfo.PRIORITY_TOP_APP - 1,
+ us1.basePriority, us2.basePriority);
+ if (topPriority != 0) {
+ return topPriority;
+ }
+ // They're either both TOP or both not TOP. Prioritize the app that has runnable EJs
+ // pending.
+ final int ejPriority = prioritizeExistenceOver(0, us1.numEJs, us2.numEJs);
if (ejPriority != 0) {
return ejPriority;
}
- // They both have EJs. Order them by EJ enqueue time to help provide low EJ latency.
+ // They both have runnable EJs.
+ // Prioritize an FGS+ app. If neither are FGS+ apps, then use a later prioritization
+ // check.
+ final int fgsPriority = prioritizeExistenceOver(JobInfo.PRIORITY_FOREGROUND_SERVICE - 1,
+ us1.basePriority, us2.basePriority);
+ if (fgsPriority != 0) {
+ return fgsPriority;
+ }
+ // Order them by EJ enqueue time to help provide low EJ latency.
if (us1.earliestEJEnqueueTime < us2.earliestEJEnqueueTime) {
return -1;
} else if (us1.earliestEJEnqueueTime > us2.earliestEJEnqueueTime) {
return 1;
}
+ // Order by any latent important proc states.
if (us1.basePriority != us2.basePriority) {
return us2.basePriority - us1.basePriority;
}
+ // Order by enqueue time.
if (us1.earliestEnqueueTime < us2.earliestEnqueueTime) {
return -1;
}
@@ -480,7 +507,7 @@ public final class ConnectivityController extends RestrictingController implemen
UidStats uidStats = mUidStats.get(uid);
if (uidStats != null && uidStats.basePriority != newPriority) {
uidStats.basePriority = newPriority;
- maybeAdjustRegisteredCallbacksLocked();
+ postAdjustCallbacks();
}
}