Skip to content

Commit 2a8862d

Browse files
committed
drm/i915: Reduce the RPS shock
Limit deboosting and boosting to keep ourselves at the extremes when in the respective power modes (i.e. slowly decrease frequencies while in the HIGH_POWER zone and slowly increase frequencies while in the LOW_POWER zone). On idle, we will hit the timeout and drop to the next level quickly, and conversely if busy we expect to hit a waitboost and rapidly switch into max power. This should improve the UX experience by keeping the GPU clocks higher than they ostensibly should be (based on simple busyness) by switching into the INTERACTIVE mode (due to waiting for pageflips) and increasing clocks via waitboosting. This will incur some additional power, our saving grace should be rc6 and powergating to keep the extra current draw in check. Food for future thought would be deadline scheduling? If we know certain contexts (high priority compositors) absolutely must hit the next vblank then we can raise the frequencies ahead of time. Part of this is covered by per-context frequencies, where userspace is given control over the frequency range they want the GPU to execute at (for largely the same problem as this, where the workload is very latency sensitive but at the EI level appears mostly idle). Indeed, the per-context series does extend the modeset boosting to include a frequency range tweak which seems applicable to solving this jittery UX behaviour. Reported-by: Lyude Paul <[email protected]> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=109408 References: 0d55bab ("drm/i915: Drop stray clearing of rps->last_adj") References: 60548c5 ("drm/i915: Interactive RPS mode") Signed-off-by: Chris Wilson <[email protected]> Cc: Lyude Paul <[email protected]> Cc: Eero Tamminen <[email protected]> Cc: Joonas Lahtinen <[email protected]> Cc: Michel Thierry <[email protected]> Quoting Lyude Paul: > Before reverting 0d55bab: [4.20] > > 35 measurements [of gnome-shell animations] > Average: 33.65657142857143 FPS > FPS observed: 20.8 - 46.87 FPS > Percentage under 60 FPS: 100.0% > Percentage under 55 FPS: 100.0% > Percentage under 50 FPS: 100.0% > Percentage under 45 FPS: 97.14285714285714% > Percentage under 40 FPS: 97.14285714285714% > Percentage under 35 FPS: 45.714285714285715% > Percentage under 30 FPS: 11.428571428571429% > Percentage under 25 FPS: 2.857142857142857% > > After reverting: [4.19 behaviour] > > 30 measurements > Average: 49.833666666666666 FPS > FPS observed: 33.85 - 60.0 FPS > Percentage under 60 FPS: 86.66666666666667% > Percentage under 55 FPS: 70.0% > Percentage under 50 FPS: 53.333333333333336% > Percentage under 45 FPS: 20.0% > Percentage under 40 FPS: 6.666666666666667% > Percentage under 35 FPS: 6.666666666666667% > Percentage under 30 FPS: 0% > Percentage under 25 FPS: 0% > > Patched: > 42 measurements > Average: 46.05428571428571 FPS > FPS observed: 1.82 - 59.98 FPS > Percentage under 60 FPS: 88.09523809523809% > Percentage under 55 FPS: 61.904761904761905% > Percentage under 50 FPS: 45.23809523809524% > Percentage under 45 FPS: 35.714285714285715% > Percentage under 40 FPS: 33.33333333333333% > Percentage under 35 FPS: 19.047619047619047% > Percentage under 30 FPS: 7.142857142857142% > Percentage under 25 FPS: 4.761904761904762% Tested-by: Lyude Paul <[email protected]> Reviewed-by: Mika Kuoppala <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 7412826 commit 2a8862d

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

drivers/gpu/drm/i915/i915_irq.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,6 +1288,18 @@ static void gen6_pm_rps_work(struct work_struct *work)
12881288

12891289
rps->last_adj = adj;
12901290

1291+
/*
1292+
* Limit deboosting and boosting to keep ourselves at the extremes
1293+
* when in the respective power modes (i.e. slowly decrease frequencies
1294+
* while in the HIGH_POWER zone and slowly increase frequencies while
1295+
* in the LOW_POWER zone). On idle, we will hit the timeout and drop
1296+
* to the next level quickly, and conversely if busy we expect to
1297+
* hit a waitboost and rapidly switch into max power.
1298+
*/
1299+
if ((adj < 0 && rps->power.mode == HIGH_POWER) ||
1300+
(adj > 0 && rps->power.mode == LOW_POWER))
1301+
rps->last_adj = 0;
1302+
12911303
/* sysfs frequency interfaces may have snuck in while servicing the
12921304
* interrupt
12931305
*/

0 commit comments

Comments
 (0)