From e3b4c10f239f69e5282bde1d3b0c3685b24cf0aa Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 23 Jun 2011 20:54:28 +0100 Subject: sna: Relent and workaround the lack of O_NONBLOCK on /dev/dri/card0 So in order not to block server shutdown, check that the fd is readable before attempting to read from it. Signed-off-by: Chris Wilson --- src/sna/sna_driver.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c index d791ee33..4ae6b5fc 100644 --- a/src/sna/sna_driver.c +++ b/src/sna/sna_driver.c @@ -68,6 +68,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include +#include #include "i915_drm.h" #if DEBUG_DRIVER @@ -707,6 +708,17 @@ static void sna_leave_vt(int scrnIndex, int flags) "drmDropMaster failed: %s\n", strerror(errno)); } +/* In order to workaround a kernel bug in not honouring O_NONBLOCK, + * check that the fd is readable before attempting to read the next + * event from drm. + */ +static Bool sna_dri_has_pending_events(struct sna *sna) +{ + struct pollfd pfd; + pfd.fd = sna->kgem.fd; + pfd.events = POLLIN; + return poll(&pfd, 1, 0) == 1; +} static Bool sna_close_screen(int scrnIndex, ScreenPtr screen) { @@ -721,7 +733,8 @@ static Bool sna_close_screen(int scrnIndex, ScreenPtr screen) /* drain the event queues */ sna_accel_wakeup_handler(sna); - sna_dri_wakeup(sna); + if (sna_dri_has_pending_events(sna)) + sna_dri_wakeup(sna); if (scrn->vtSema == TRUE) sna_leave_vt(scrnIndex, 0); -- cgit v1.2.3