diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2018-09-05 11:29:43 +0200 |
---|---|---|
committer | Michel Dänzer <michel.daenzer@amd.com> | 2018-09-05 11:29:43 +0200 |
commit | 4c7d5e50a5e469a541bc463cecb505fe850c0824 (patch) | |
tree | 993ed51e2c1a85493c96b774af789936bdaea65c | |
parent | 87b9a3e516d19dd1b89a64f6cac990fae53fc1b3 (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)
-rw-r--r-- | src/radeon_drm_queue.c | 12 |
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, |