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