From 6dd28bd2c7e0ce32fa38b72a49007b9f5fe88272 Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Wed, 29 Nov 2017 21:23:29 +0100 Subject: [PATCH] monitor-manager-kms: poll() on KMS fd on EAGAIN When drmHandleEvent() returns an error and errno is set to EAGAIN, instead of ending up in a busy loop, poll() the fd until there is anything to read. This is a simple backport of commit 406359bba1. https://bugzilla.gnome.org/show_bug.cgi?id=791024 --- .../native/meta-monitor-manager-kms.c | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c index cbd5209c2..32a8aa67c 100644 --- a/src/backends/native/meta-monitor-manager-kms.c +++ b/src/backends/native/meta-monitor-manager-kms.c @@ -34,6 +34,7 @@ #include #include +#include #include #include #include @@ -1782,7 +1783,34 @@ meta_monitor_manager_kms_wait_for_flip (MetaMonitorManagerKms *manager_kms) memset (&evctx, 0, sizeof evctx); evctx.version = DRM_EVENT_CONTEXT_VERSION; evctx.page_flip_handler = page_flip_handler; - drmHandleEvent (manager_kms->fd, &evctx); + + while (TRUE) + { + if (drmHandleEvent (manager_kms->fd, &evctx) != 0) + { + struct pollfd pfd; + int ret; + + if (errno != EAGAIN) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + strerror (errno)); + return; + } + + pfd.fd = manager_kms->fd; + pfd.events = POLL_IN | POLL_ERR; + do + { + ret = poll (&pfd, 1, -1); + } + while (ret == -1 && errno == EINTR); + } + else + { + break; + } + } } static gboolean