Sophie

Sophie

distrib > Mageia > 7 > i586 > media > core-updates-src > by-pkgid > 920650749d98f8953fff38d3a9398ae7 > files > 1

libdrm-2.4.101-1.mga7.src.rpm

From 2b648f9980b90d62d30ca6248d2ee954d0514a8a Mon Sep 17 00:00:00 2001
From: Frederic Crozat <fcrozat@mandriva.com>
Date: Tue, 7 Apr 2009 16:31:22 +0200
Subject: [PATCH] improve waiting for dri device to appear when system is busy

Rebased for 2.4.69 / tmb
---
 xf86drm.c |   29 +++++++++++++++++++++++++----
 1 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/xf86drm.c b/libdrm/xf86drm.c
index 7672ea5..963eaf2 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -120,6 +120,7 @@ struct drm_pciinfo {
 #define memclear(s) memset(&s, 0, sizeof(s))
 
 static drmServerInfoPtr drm_server_info;
+static int drmOpenDeviceSimpleCheck = 0;
 
 drm_public void drmSetServerInfo(drmServerInfoPtr info)
 {
@@ -370,22 +371,41 @@ static int drmOpenDevice(dev_t dev, int
 #else
     /* if we modprobed then wait for udev */
     {
+        #define MAX_UDEV_COUNT 50
         int udev_count = 0;
+	struct timespec delay_struct;
+
+	delay_struct.tv_sec = 0;
+
+	if (drmOpenDeviceSimpleCheck) {
+		udev_count = MAX_UDEV_COUNT-1;
+		delay_struct.tv_nsec = 0;
+		drmOpenDeviceSimpleCheck= 0;
+	}
+	else {
+		if (minor == 0) {
+			delay_struct.tv_nsec = 15000000;
+		}
+		else {
+			delay_struct.tv_nsec = 50000;
+		}
+	}
+
 wait_for_udev:
         if (stat(DRM_DIR_NAME, &st)) {
-            usleep(20);
+            nanosleep(&delay_struct, NULL);
             udev_count++;
 
-            if (udev_count == 50)
+            if (udev_count == MAX_UDEV_COUNT)
                 return -1;
             goto wait_for_udev;
         }
 
         if (stat(buf, &st)) {
-            usleep(20);
+            nanosleep(&delay_struct, NULL);
             udev_count++;
 
-            if (udev_count == 50)
+            if (udev_count == MAX_UDEV_COUNT)
                 return -1;
             goto wait_for_udev;
         }
@@ -483,6 +503,7 @@ int drmAvailable(void)
     int           retval = 0;
     int           fd;
 
+    drmOpenDeviceSimpleCheck = 1;
     if ((fd = drmOpenMinor(0, 1, DRM_NODE_PRIMARY)) < 0) {
         return 0;
     }