Deadline gets permanently skewed after sleep, cursor is immovable
Affected version
Main commit ae35c1ef
Bug summary
After wakeup from sleep the cursor is immovable.
Steps to reproduce
- Log in, verify that deadline evasion is used
- sleep machine
- wakeup, cursor is stuck 99.9%, non-cursor updates still work
What happened
Stuck cursor updates.
Relevant logs, screenshots, screencasts etc.
KMS_DEADLINE: Missed deadline by 2305843009213688212µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213687768µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213688471µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213688291µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213687704µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213688280µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213688919µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213688225µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213688310µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213687732µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213689408µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213688331µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213689495µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213688302µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213687882µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213692617µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213688161µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213689008µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213687744µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213688283µs, skipping by 6944µs
KMS_DEADLINE: Missed deadline by 2305843009213688235µs, skipping by 6944µs
A quick and totally uninformed look at this I think the code only adjusts for a single missed refresh. What happens if many refreshes/deadlines were missed? I did the following quick&dirty that makes the cursor behave after sleep:
--- a/src/backends/native/meta-kms-crtc.c
+++ b/src/backends/native/meta-kms-crtc.c
@@ -680,6 +680,9 @@ meta_kms_crtc_determine_deadline (MetaKmsCrtc *crtc,
next_presentation_us += refresh_interval_us;
next_deadline_us += refresh_interval_us;
+ if (now_us > next_deadline_us){
+ next_deadline_us += now_us - next_deadline_us;
+ }
}
}
Thoughts?