Disable SCHED_FIFO when turning off the display.
There can be long SF runtimes when turning the display on or off. Only
use SCHED_FIFO when we are actively going to be rendering frames, not
when turning the display on or off.
bug 30375418
Change-Id: Ibef8e5f3bba0bafc36f92f9f1b299f015fc335f9
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index a36a8cd..820c332 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -2613,6 +2613,7 @@
}
if (currentMode == HWC_POWER_MODE_OFF) {
+ // Turn on the display
getHwComposer().setPowerMode(type, mode);
if (type == DisplayDevice::DISPLAY_PRIMARY) {
// FIXME: eventthread only knows about the main display right now
@@ -2623,7 +2624,19 @@
mVisibleRegionsDirty = true;
mHasPoweredOff = true;
repaintEverything();
+
+ struct sched_param param = {0};
+ param.sched_priority = 1;
+ if (sched_setscheduler(0, SCHED_FIFO, ¶m) != 0) {
+ ALOGW("Couldn't set SCHED_FIFO on display on");
+ }
} else if (mode == HWC_POWER_MODE_OFF) {
+ // Turn off the display
+ struct sched_param param = {0};
+ if (sched_setscheduler(0, SCHED_OTHER, ¶m) != 0) {
+ ALOGW("Couldn't set SCHED_OTHER on display off");
+ }
+
if (type == DisplayDevice::DISPLAY_PRIMARY) {
disableHardwareVsync(true); // also cancels any in-progress resync