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