From 5aae8a05264c354aa93017d323ce238858f68227 Mon Sep 17 00:00:00 2001 From: Kai-Heng Feng Date: Thu, 29 Dec 2022 13:43:27 +0800 Subject: [PATCH] iris: Retry DRM_IOCTL_I915_GEM_EXECBUFFER2 on ENOMEM MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit We are seeing endless DRM_IOCTL_SYNCOBJ_WAIT ioctl when system memory is under pressured. Commit f9d8d9acbb6a ("iris: Avoid abort() if kernel can't allocate memory") avoids the abort() on ENOMEM by resetting the batch. However, when there's an ongoing OpenGL query, resetting the batch will make the snapshots_landed never be flipped, so iris_get_query_result() gets stuck in the while loop forever. Since there's no guarantee that the next batch after resetting won't hit ENOMEM, so instead of resetting the batch, be patient and wait until kernel has enough memory. Once the batch is submiited and snapshots_landed gets flipped, iris_get_query_result() can proceed normally. Reviewed-by: José Roberto de Souza Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/6851 Part-of: --- src/gallium/drivers/iris/iris_batch.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/iris/iris_batch.c b/src/gallium/drivers/iris/iris_batch.c index 3ad3232..8f46bd5 100644 --- a/src/gallium/drivers/iris/iris_batch.c +++ b/src/gallium/drivers/iris/iris_batch.c @@ -982,9 +982,14 @@ submit_batch(struct iris_batch *batch) } int ret = 0; - if (!batch->screen->devinfo->no_hw && - intel_ioctl(batch->screen->fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf)) - ret = -errno; + if (!batch->screen->devinfo->no_hw) { + do { + ret = intel_ioctl(batch->screen->fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf); + } while (ret && errno == ENOMEM); + + if (ret) + ret = -errno; + } simple_mtx_unlock(bo_deps_lock); -- 2.7.4