xf86-video-intel: src/intel_display.c src/intel_driver.c src/intel.h

Chris Wilson ickle at kemper.freedesktop.org
Thu Oct 25 02:20:15 PDT 2012


 src/intel.h         |    1 +
 src/intel_display.c |   21 +++++++++++++++++++++
 src/intel_driver.c  |    2 ++
 3 files changed, 24 insertions(+)

New commits:
commit ef431b2d35c1bf4d77bbcc73688951d22f6aa135
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Oct 25 10:15:39 2012 +0100

    uxa: Drain the DRM event queue before server regeneration
    
    Adam Jackson notes that what appeared to be my paranoid ramblings in SNA
    actually served a purpose - it prevents a server crash following
    server regen if an indirect client happened to be running at the time
    (e.g. LIBGL_INDIRECT_ALWAYS=1 glxgears).
    
    Reported-by: Adam Jackson <ajax at redhat.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel.h b/src/intel.h
index a5603fe..d394750 100644
--- a/src/intel.h
+++ b/src/intel.h
@@ -366,6 +366,7 @@ extern Bool intel_mode_pre_init(ScrnInfoPtr pScrn, int fd, int cpp);
 extern void intel_mode_init(struct intel_screen_private *intel);
 extern void intel_mode_disable_unused_functions(ScrnInfoPtr scrn);
 extern void intel_mode_remove_fb(intel_screen_private *intel);
+extern void intel_mode_close(intel_screen_private *intel);
 extern void intel_mode_fini(intel_screen_private *intel);
 
 extern int intel_get_pipe_from_crtc_id(drm_intel_bufmgr *bufmgr, xf86CrtcPtr crtc);
diff --git a/src/intel_display.c b/src/intel_display.c
index f442da9..2c93c2d 100644
--- a/src/intel_display.c
+++ b/src/intel_display.c
@@ -31,6 +31,7 @@
 
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/poll.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <errno.h>
@@ -1830,6 +1831,26 @@ intel_mode_remove_fb(intel_screen_private *intel)
 	}
 }
 
+static Bool has_pending_events(int fd)
+{
+	struct pollfd pfd;
+	pfd.fd = fd;
+	pfd.events = POLLIN;
+	return poll(&pfd, 1, 0) == 1;
+}
+
+void
+intel_mode_close(intel_screen_private *intel)
+{
+	struct intel_mode *mode = intel->modes;
+
+	if (mode == NULL)
+		return;
+
+	while (has_pending_events(mode->fd))
+		drmHandleEvent(mode->fd, &mode->event_context);
+}
+
 void
 intel_mode_fini(intel_screen_private *intel)
 {
diff --git a/src/intel_driver.c b/src/intel_driver.c
index 65a5008..3029b22 100644
--- a/src/intel_driver.c
+++ b/src/intel_driver.c
@@ -1139,6 +1139,8 @@ static Bool I830CloseScreen(CLOSE_SCREEN_ARGS_DECL)
 	I830UeventFini(scrn);
 #endif
 
+	intel_mode_close(intel);
+
 	DeleteCallback(&FlushCallback, intel_flush_callback, scrn);
 
 	intel_glamor_close_screen(screen);


More information about the xorg-commit mailing list