summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2018-09-05 11:29:43 +0200
committerMichel Dänzer <michel.daenzer@amd.com>2018-09-05 11:29:43 +0200
commit4c7d5e50a5e469a541bc463cecb505fe850c0824 (patch)
tree993ed51e2c1a85493c96b774af789936bdaea65c /src
parent87b9a3e516d19dd1b89a64f6cac990fae53fc1b3 (diff)
Don't use xorg_list_for_each_entry_safe for signalled flips
drm_wait_pending_flip can get called from drm_handle_event, in which case xorg_list_for_each_entry_safe can end up processing the same entry in both. To avoid this, just process the first list entry until the list is empty. (Ported from amdgpu commit 26770be44b89b83bf39c28f2fe284c8cb92ed0c0)
Diffstat (limited to 'src')
-rw-r--r--src/radeon_drm_queue.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/radeon_drm_queue.c b/src/radeon_drm_queue.c
index 61a2f5ce..bf1650ea 100644
--- a/src/radeon_drm_queue.c
+++ b/src/radeon_drm_queue.c
@@ -257,8 +257,11 @@ radeon_drm_handle_event(int fd, drmEventContext *event_context)
r = drmHandleEvent(fd, event_context);
- xorg_list_for_each_entry_safe(e, tmp, &radeon_drm_flip_signalled, list)
+ while (!xorg_list_is_empty(&radeon_drm_flip_signalled)) {
+ e = xorg_list_first_entry(&radeon_drm_flip_signalled,
+ struct radeon_drm_queue_entry, list);
radeon_drm_queue_handle_one(e);
+ }
xorg_list_for_each_entry_safe(e, tmp, &radeon_drm_vblank_signalled, list) {
drmmode_crtc_private_ptr drmmode_crtc = e->crtc->driver_private;
@@ -277,12 +280,15 @@ void radeon_drm_wait_pending_flip(xf86CrtcPtr crtc)
{
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
RADEONEntPtr pRADEONEnt = RADEONEntPriv(crtc->scrn);
- struct radeon_drm_queue_entry *e, *tmp;
+ struct radeon_drm_queue_entry *e;
drmmode_crtc->wait_flip_nesting_level++;
- xorg_list_for_each_entry_safe(e, tmp, &radeon_drm_flip_signalled, list)
+ while (!xorg_list_is_empty(&radeon_drm_flip_signalled)) {
+ e = xorg_list_first_entry(&radeon_drm_flip_signalled,
+ struct radeon_drm_queue_entry, list);
radeon_drm_queue_handle_one(e);
+ }
while (drmmode_crtc->flip_pending
&& radeon_drm_handle_event(pRADEONEnt->fd,