Tweak EJ & UI job thermal policy.

Tweak the thermal restriction policy for expedited and user-initiated
jobs so we restrict them at THERMAL_STATUS_MODERATE if 1) they ran in
the past, or 2) they are running in overtime.

Bug: 230807327
Bug: 261999509
Test: atest FrameworksMockingServicesTests:ThermalStatusRestrictionTest
Change-Id: I252de23d77b1997abf258cb385e96bced16ac73a
This commit is contained in:
Kweku Adams
2022-12-09 22:29:47 +00:00
parent 73ce8d4e2a
commit 79809166ce
2 changed files with 85 additions and 6 deletions

View File

@@ -91,12 +91,23 @@ public class ThermalStatusRestriction extends JobRestriction {
}
final int priority = job.getEffectivePriority();
if (mThermalStatus >= HIGHER_PRIORITY_THRESHOLD) {
// For moderate throttling, only let expedited jobs and high priority regular jobs that
// haven't been running for a long time run.
return !job.shouldTreatAsExpeditedJob()
&& !(priority == JobInfo.PRIORITY_HIGH
&& mService.isCurrentlyRunningLocked(job)
&& !mService.isJobInOvertimeLocked(job));
// For moderate throttling:
// Only let expedited & user-initiated jobs run if:
// 1. They haven't previously run
// 2. They're already running and aren't yet in overtime
// Only let high priority jobs run if:
// They are already running and aren't yet in overtime
// Don't let any other job run.
if (job.shouldTreatAsExpeditedJob() || job.shouldTreatAsUserInitiated()) {
return job.getNumPreviousAttempts() > 0
|| (mService.isCurrentlyRunningLocked(job)
&& mService.isJobInOvertimeLocked(job));
}
if (priority == JobInfo.PRIORITY_HIGH) {
return !mService.isCurrentlyRunningLocked(job)
|| mService.isJobInOvertimeLocked(job);
}
return true;
}
if (mThermalStatus >= LOW_PRIORITY_THRESHOLD) {
// For light throttling, throttle all min priority jobs and all low priority jobs that

View File

@@ -180,14 +180,47 @@ public class ThermalStatusRestrictionTest {
createJobBuilder(7).setExpedited(true).build());
final JobStatus ej = spy(createJobStatus("testIsJobRestricted",
createJobBuilder(8).setExpedited(true).build()));
final JobStatus ejRetried = spy(createJobStatus("testIsJobRestricted",
createJobBuilder(11).setExpedited(true).build()));
final JobStatus ejRunning = spy(createJobStatus("testIsJobRestricted",
createJobBuilder(12).setExpedited(true).build()));
final JobStatus ejRunningLong = spy(createJobStatus("testIsJobRestricted",
createJobBuilder(13).setExpedited(true).build()));
final JobStatus ui = spy(createJobStatus("testIsJobRestricted",
createJobBuilder(14).build()));
final JobStatus uiRetried = spy(createJobStatus("testIsJobRestricted",
createJobBuilder(15).build()));
final JobStatus uiRunning = spy(createJobStatus("testIsJobRestricted",
createJobBuilder(16).build()));
final JobStatus uiRunningLong = spy(createJobStatus("testIsJobRestricted",
createJobBuilder(17).build()));
when(ej.shouldTreatAsExpeditedJob()).thenReturn(true);
when(ejRetried.shouldTreatAsExpeditedJob()).thenReturn(true);
when(ejRunning.shouldTreatAsExpeditedJob()).thenReturn(true);
when(ejRunningLong.shouldTreatAsExpeditedJob()).thenReturn(true);
when(ui.shouldTreatAsUserInitiated()).thenReturn(true);
when(uiRetried.shouldTreatAsUserInitiated()).thenReturn(true);
when(uiRunning.shouldTreatAsUserInitiated()).thenReturn(true);
when(uiRunningLong.shouldTreatAsUserInitiated()).thenReturn(true);
when(ejRetried.getNumPreviousAttempts()).thenReturn(1);
when(uiRetried.getNumPreviousAttempts()).thenReturn(2);
when(mJobSchedulerService.isCurrentlyRunningLocked(jobLowPriorityRunning)).thenReturn(true);
when(mJobSchedulerService.isCurrentlyRunningLocked(jobHighPriorityRunning))
.thenReturn(true);
when(mJobSchedulerService.isCurrentlyRunningLocked(jobLowPriorityRunningLong))
.thenReturn(true);
when(mJobSchedulerService.isCurrentlyRunningLocked(jobHighPriorityRunningLong))
.thenReturn(true);
when(mJobSchedulerService.isCurrentlyRunningLocked(ejRunning)).thenReturn(true);
when(mJobSchedulerService.isCurrentlyRunningLocked(ejRunningLong)).thenReturn(true);
when(mJobSchedulerService.isCurrentlyRunningLocked(uiRunning)).thenReturn(true);
when(mJobSchedulerService.isCurrentlyRunningLocked(uiRunningLong)).thenReturn(true);
when(mJobSchedulerService.isJobInOvertimeLocked(jobLowPriorityRunningLong))
.thenReturn(true);
when(mJobSchedulerService.isJobInOvertimeLocked(jobHighPriorityRunningLong))
.thenReturn(true);
when(mJobSchedulerService.isJobInOvertimeLocked(ejRunningLong)).thenReturn(true);
when(mJobSchedulerService.isJobInOvertimeLocked(uiRunningLong)).thenReturn(true);
assertFalse(mThermalStatusRestriction.isJobRestricted(jobMinPriority));
assertFalse(mThermalStatusRestriction.isJobRestricted(jobLowPriority));
@@ -199,6 +232,13 @@ public class ThermalStatusRestrictionTest {
assertFalse(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong));
assertFalse(mThermalStatusRestriction.isJobRestricted(ej));
assertFalse(mThermalStatusRestriction.isJobRestricted(ejDowngraded));
assertFalse(mThermalStatusRestriction.isJobRestricted(ejRetried));
assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunning));
assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunningLong));
assertFalse(mThermalStatusRestriction.isJobRestricted(ui));
assertFalse(mThermalStatusRestriction.isJobRestricted(uiRetried));
assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunning));
assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunningLong));
mStatusChangedListener.onThermalStatusChanged(THERMAL_STATUS_LIGHT);
@@ -212,6 +252,13 @@ public class ThermalStatusRestrictionTest {
assertFalse(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong));
assertFalse(mThermalStatusRestriction.isJobRestricted(ejDowngraded));
assertFalse(mThermalStatusRestriction.isJobRestricted(ej));
assertFalse(mThermalStatusRestriction.isJobRestricted(ejRetried));
assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunning));
assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunningLong));
assertFalse(mThermalStatusRestriction.isJobRestricted(ui));
assertFalse(mThermalStatusRestriction.isJobRestricted(uiRetried));
assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunning));
assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunningLong));
mStatusChangedListener.onThermalStatusChanged(THERMAL_STATUS_MODERATE);
@@ -225,6 +272,13 @@ public class ThermalStatusRestrictionTest {
assertTrue(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong));
assertTrue(mThermalStatusRestriction.isJobRestricted(ejDowngraded));
assertFalse(mThermalStatusRestriction.isJobRestricted(ej));
assertTrue(mThermalStatusRestriction.isJobRestricted(ejRetried));
assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunning));
assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunningLong));
assertFalse(mThermalStatusRestriction.isJobRestricted(ui));
assertTrue(mThermalStatusRestriction.isJobRestricted(uiRetried));
assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunning));
assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunningLong));
mStatusChangedListener.onThermalStatusChanged(THERMAL_STATUS_SEVERE);
@@ -238,6 +292,13 @@ public class ThermalStatusRestrictionTest {
assertTrue(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong));
assertTrue(mThermalStatusRestriction.isJobRestricted(ejDowngraded));
assertTrue(mThermalStatusRestriction.isJobRestricted(ej));
assertTrue(mThermalStatusRestriction.isJobRestricted(ejRetried));
assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunning));
assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunningLong));
assertTrue(mThermalStatusRestriction.isJobRestricted(ui));
assertTrue(mThermalStatusRestriction.isJobRestricted(uiRetried));
assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunning));
assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunningLong));
mStatusChangedListener.onThermalStatusChanged(THERMAL_STATUS_CRITICAL);
@@ -251,6 +312,13 @@ public class ThermalStatusRestrictionTest {
assertTrue(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong));
assertTrue(mThermalStatusRestriction.isJobRestricted(ejDowngraded));
assertTrue(mThermalStatusRestriction.isJobRestricted(ej));
assertTrue(mThermalStatusRestriction.isJobRestricted(ejRetried));
assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunning));
assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunningLong));
assertTrue(mThermalStatusRestriction.isJobRestricted(ui));
assertTrue(mThermalStatusRestriction.isJobRestricted(uiRetried));
assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunning));
assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunningLong));
}
private JobInfo.Builder createJobBuilder(int jobId) {