[PATCH] xf86drm.c: add counter for ioctl restarting

Anton V. Boyarshinov boyarsh at altlinux.org
Fri Apr 13 06:26:42 PDT 2012


In some cases ioclt->alarm->ioctl loop can be infinite:
ioctl(7, 0x40086482, 0xbfb62738)        = ? ERESTARTSYS (To be restarted)
--- SIGALRM (Alarm clock) @ 0 (0) ---
sigreturn()                             = ? (mask now [])
ioctl(7, 0x40086482, 0xbfb62738)        = ? ERESTARTSYS (To be restarted)
and forever.

It seems, that limiting ioctl restarting by some resonable number of trys
is a dirty but working way to prevent Xorg lockups.

Signed-off-by: Anton V. Boyarshinov <boyarsh at altlinux.org>
---
 xf86drm.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/xf86drm.c b/xf86drm.c
index 6ea068f..9663f21 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -162,10 +162,11 @@ int
 drmIoctl(int fd, unsigned long request, void *arg)
 {
     int	ret;
+    int count=0;
 
     do {
 	ret = ioctl(fd, request, arg);
-    } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
+    } while (ret == -1 && (errno == EINTR || errno == EAGAIN) && ++count < 100 );
     return ret;
 }
 
-- 
1.7.5.4



More information about the dri-devel mailing list