diff --git a/src/amdgpu_drm_queue.c b/src/amdgpu_drm_queue.c index 56d593d..534ad32 100644 --- a/src/amdgpu_drm_queue.c +++ b/src/amdgpu_drm_queue.c @@ -30,6 +30,8 @@ #include "config.h" #endif +#include + #include #include #include @@ -277,7 +279,20 @@ amdgpu_drm_handle_event(int fd, drmEventContext *event_context) struct amdgpu_drm_queue_entry *e; int r; - r = drmHandleEvent(fd, event_context); + /* Retry drmHandleEvent if it was interrupted by a signal in read() */ + do { + r = drmHandleEvent(fd, event_context); + } while (r < 0 && (errno == EINTR || errno == EAGAIN)); + + if (r < 0) { + static Bool printed; + + if (!printed) { + ErrorF("%s: drmHandleEvent returned %d, errno=%d (%s)\n", + __func__, r, errno, strerror(errno)); + printed = TRUE; + } + } while (!xorg_list_is_empty(&amdgpu_drm_flip_signalled)) { e = xorg_list_first_entry(&amdgpu_drm_flip_signalled,