xf86-video-intel: src/sna/sna_display.c src/sna/sna_driver.c

Chris Wilson ickle at kemper.freedesktop.org
Tue Sep 22 02:26:15 PDT 2015


 src/sna/sna_display.c |    4 ++++
 src/sna/sna_driver.c  |    7 ++++---
 2 files changed, 8 insertions(+), 3 deletions(-)

New commits:
commit 31d42ed5637a1b2223d48d0db4d7c512b27aee07
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Sep 22 10:23:24 2015 +0100

    sna: Check for udev events before reading
    
    When performing RRGetInfo() we drain any pending uevents before checking
    the CRTC/connector statuses. However, some versions of libudev do a
    blocking read and so when we call RRGetInfo() from a Timer callback
    (outside of the usual sigtimer interrupts) that blocking read lasts
    indefinitely.
    
    Reported-by: Sedat Dilek <sedat.dilek at gmail.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index b57eea4..1b1a125 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -4840,6 +4840,8 @@ void sna_mode_discover(struct sna *sna)
 	int i, j;
 
 	DBG(("%s()\n", __FUNCTION__));
+	sna->flags &= ~SNA_REPROBE;
+
 	VG_CLEAR(connectors);
 
 	memset(&res, 0, sizeof(res));
@@ -4960,6 +4962,8 @@ static CARD32 sna_mode_coldplug(OsTimerPtr timer, CARD32 now, void *data)
 		if (output->status == XF86OutputStatusDisconnected)
 			continue;
 
+		DBG(("%s: output %s connected, needs reprobe\n",
+		     __FUNCTION__, output->name));
 		reprobe = true;
 	}
 
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 18fc48d..539093e 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -755,7 +755,7 @@ sna_handle_uevents(int fd, void *closure)
 	if (fstat(sna->kgem.fd, &s))
 		memset(&s, 0, sizeof(s));
 
-	do {
+	while (poll(&pfd, 1, 0) > 0) {
 		struct udev_device *dev;
 		dev_t devnum;
 
@@ -773,7 +773,7 @@ sna_handle_uevents(int fd, void *closure)
 		}
 
 		udev_device_unref(dev);
-	} while (poll(&pfd, 1, 0) > 0);
+	}
 
 	if (hotplug) {
 		DBG(("%s: hotplug event (vtSema?=%d)\n",
@@ -890,6 +890,8 @@ sna_randr_getinfo(ScreenPtr screen, Rotation *rotations)
 {
 	struct sna *sna = to_sna_from_screen(screen);
 
+	DBG(("%s()\n", __FUNCTION__));
+
 	if (!sna_uevent_poll(sna))
 		sna_mode_discover(sna);
 
@@ -1221,7 +1223,6 @@ static Bool sna_enter_vt(VT_FUNC_ARGS_DECL)
 	if (sna->flags & SNA_REPROBE) {
 		DBG(("%s: reporting deferred hotplug event\n", __FUNCTION__));
 		sna_mode_discover(sna);
-		sna->flags &= ~SNA_REPROBE;
 	}
 
 	sna_set_desired_mode(sna);


More information about the xorg-commit mailing list