diff options
Diffstat (limited to 'contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-restart-pushbuf.patch')
-rw-r--r-- | contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-restart-pushbuf.patch | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-restart-pushbuf.patch b/contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-restart-pushbuf.patch new file mode 100644 index 00000000..408a519c --- /dev/null +++ b/contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-restart-pushbuf.patch @@ -0,0 +1,50 @@ +From 67628aa39dd74807989492af5451a3a5c0232e39 Mon Sep 17 00:00:00 2001 +From: Ben Skeggs <bskeggs@redhat.com> +Date: Tue, 20 Oct 2009 12:57:46 +1000 +Subject: [PATCH] nouveau: retry if pushbuf ioctl interrupted by signal + +Signed-off-by: Ben Skeggs <bskeggs@redhat.com> +--- + libdrm/nouveau/nouveau_pushbuf.c | 6 ++++++ + 1 files changed, 6 insertions(+), 0 deletions(-) + +diff --git a/libdrm/nouveau/nouveau_pushbuf.c b/libdrm/nouveau/nouveau_pushbuf.c +index 1192e22..fbcddd7 100644 +--- a/libdrm/nouveau/nouveau_pushbuf.c ++++ b/libdrm/nouveau/nouveau_pushbuf.c +@@ -270,6 +270,7 @@ nouveau_pushbuf_flush(struct nouveau_channel *chan, unsigned min) + if (nvpb->base.remaining > 2) /* space() will fixup if not */ + nvpb->base.remaining -= 2; + ++restart_cal: + req.channel = chan->id; + req.handle = nvpb->buffer[nvpb->current]->handle; + req.offset = nvpb->current_offset * 4; +@@ -284,12 +285,15 @@ nouveau_pushbuf_flush(struct nouveau_channel *chan, unsigned min) + ret = drmCommandWriteRead(nvdev->fd, + DRM_NOUVEAU_GEM_PUSHBUF_CALL, + &req, sizeof(req)); ++ if (ret == -EAGAIN) ++ goto restart_cal; + nvpb->cal_suffix0 = req.suffix0; + nvpb->cal_suffix1 = req.suffix1; + assert(ret == 0); + } else { + struct drm_nouveau_gem_pushbuf req; + ++restart_push: + req.channel = chan->id; + req.nr_dwords = nvpb->size - nvpb->base.remaining; + req.dwords = (uint64_t)(unsigned long)nvpb->pushbuf; +@@ -299,6 +303,8 @@ nouveau_pushbuf_flush(struct nouveau_channel *chan, unsigned min) + req.relocs = (uint64_t)(unsigned long)nvpb->relocs; + ret = drmCommandWrite(nvdev->fd, DRM_NOUVEAU_GEM_PUSHBUF, + &req, sizeof(req)); ++ if (ret == -EAGAIN) ++ goto restart_push; + assert(ret == 0); + } + +-- +1.6.5.1 + |