[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