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

Chris Wilson ickle at kemper.freedesktop.org
Tue Jul 28 05:52:47 PDT 2015


 src/sna/sna_driver.c |   56 +++++++++++++++++++++++++++------------------------
 1 file changed, 30 insertions(+), 26 deletions(-)

New commits:
commit 4f0a58c9db4d1ac32a79c87392454ad859912f47
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jul 28 13:49:55 2015 +0100

    sna: Batch process hotplug events
    
    Read all available HOTPLUG uevents and batch them into a single topology
    probe. Like waiting for a bus, when one hotplug uevent arrives expect a
    few more.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 43d2707..6db129f 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -743,37 +743,48 @@ static void
 sna_handle_uevents(int fd, void *closure)
 {
 	struct sna *sna = closure;
-	struct udev_device *dev;
-	const char *str;
 	struct stat s;
-	dev_t udev_devnum;
+	struct pollfd pfd;
+	bool hotplug = false;
 
 	DBG(("%s\n", __FUNCTION__));
 
-	dev = udev_monitor_receive_device(sna->uevent_monitor);
-	if (!dev)
-		return;
+	pfd.fd = udev_monitor_get_fd(sna->uevent_monitor);
+	pfd.events = POLLIN;
 
-	udev_devnum = udev_device_get_devnum(dev);
-	if (fstat(sna->kgem.fd, &s) || memcmp(&s.st_rdev, &udev_devnum, sizeof (dev_t))) {
-		udev_device_unref(dev);
-		return;
-	}
+	if (fstat(sna->kgem.fd, &s))
+		memset(&s, 0, sizeof(s));
+
+	do {
+		struct udev_device *dev;
+		dev_t devnum;
 
-	str = udev_device_get_property_value(dev, "HOTPLUG");
-	if (str && atoi(str) == 1) {
-		ScrnInfoPtr scrn = sna->scrn;
+		dev = udev_monitor_receive_device(sna->uevent_monitor);
+		if (dev == NULL)
+			break;
 
-		DBG(("%s: hotplug event (vtSema?=%d)\n", __FUNCTION__, scrn->vtSema));
+		devnum = udev_device_get_devnum(dev);
+		if (memcmp(&s.st_rdev, &devnum, sizeof(dev_t)) == 0) {
+			const char *str;
+
+			str = udev_device_get_property_value(dev, "HOTPLUG");
+			if (str && atoi(str) == 1)
+				hotplug = true;
+		}
 
-		if (scrn->vtSema) {
+		udev_device_unref(dev);
+	} while (poll(&pfd, 1, 0) > 0);
+
+	if (hotplug) {
+		DBG(("%s: hotplug event (vtSema?=%d)\n",
+		     __FUNCTION__, sna->scrn->vtSema));
+
+		if (sna->scrn->vtSema) {
 			sna_mode_discover(sna);
 			sna_mode_check(sna);
 		} else
 			sna->flags |= SNA_REPROBE;
 	}
-
-	udev_device_unref(dev);
 }
 
 static bool has_randr(void)
@@ -842,17 +853,10 @@ err_dev:
 
 static bool sna_uevent_poll(struct sna *sna)
 {
-	struct pollfd pfd;
-
 	if (sna->uevent_monitor == NULL)
 		return false;
 
-	pfd.fd = udev_monitor_get_fd(sna->uevent_monitor);
-	pfd.events = POLLIN;
-
-	while (poll(&pfd, 1, 0) > 0)
-		sna_handle_uevents(pfd.fd, sna);
-
+	sna_handle_uevents(udev_monitor_get_fd(sna->uevent_monitor), sna);
 	return true;
 }
 


More information about the xorg-commit mailing list