summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2018-08-29 18:49:19 +0200
committerMichel Dänzer <michel@daenzer.net>2018-08-31 17:52:22 +0200
commit26770be44b89b83bf39c28f2fe284c8cb92ed0c0 (patch)
tree9418476b8cfcb093f8e67015399f5fceb748b7fa
parent7eea3e2cd74eed22e982319144e18ae5b1087b78 (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.
-rw-r--r--src/amdgpu_drm_queue.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/amdgpu_drm_queue.c b/src/amdgpu_drm_queue.c
index f9db81c..ba841d1 100644
--- a/src/amdgpu_drm_queue.c
+++ b/src/amdgpu_drm_queue.c
@@ -257,8 +257,11 @@ amdgpu_drm_handle_event(int fd, drmEventContext *event_context)
r = drmHandleEvent(fd, event_context);
- xorg_list_for_each_entry_safe(e, tmp, &amdgpu_drm_flip_signalled, list)
+ while (!xorg_list_is_empty(&amdgpu_drm_flip_signalled)) {
+ e = xorg_list_first_entry(&amdgpu_drm_flip_signalled,
+ struct amdgpu_drm_queue_entry, list);
amdgpu_drm_queue_handle_one(e);
+ }
xorg_list_for_each_entry_safe(e, tmp, &amdgpu_drm_vblank_signalled, list) {
drmmode_crtc_private_ptr drmmode_crtc = e->crtc->driver_private;
@@ -277,12 +280,15 @@ void amdgpu_drm_wait_pending_flip(xf86CrtcPtr crtc)
{
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(crtc->scrn);
- struct amdgpu_drm_queue_entry *e, *tmp;
+ struct amdgpu_drm_queue_entry *e;
drmmode_crtc->wait_flip_nesting_level++;
- xorg_list_for_each_entry_safe(e, tmp, &amdgpu_drm_flip_signalled, list)
+ while (!xorg_list_is_empty(&amdgpu_drm_flip_signalled)) {
+ e = xorg_list_first_entry(&amdgpu_drm_flip_signalled,
+ struct amdgpu_drm_queue_entry, list);
amdgpu_drm_queue_handle_one(e);
+ }
while (drmmode_crtc->flip_pending
&& amdgpu_drm_handle_event(pAMDGPUEnt->fd,