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

Daniel Vetter daniel at ffwll.ch
Fri Apr 13 06:42:16 PDT 2012


On Fri, Apr 13, 2012 at 05:26:42PM +0400, Anton V. Boyarshinov wrote:
> 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 );

We rely on restarting after signals when blocking for the gpu, busy gpu
plus mouse wiggling can easily reach that.

NACKed-by: Daniel Vetter <daniel.vetter at ffwll.ch>

Obviously if we have a dead gpu, we need to break out of this loop. But
detecting a dead gpu (and returning an appropriate error like EIO) is the
kernel's job.

Cheers, Daniel

>      return ret;
>  }
>  
> -- 
> 1.7.5.4
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Daniel Vetter
Mail: daniel at ffwll.ch
Mobile: +41 (0)79 365 57 48


More information about the dri-devel mailing list