mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-08 22:45:43 +00:00
47 lines
1.8 KiB
Diff
47 lines
1.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Kai-Heng Feng <kai.heng.feng@canonical.com>
|
|
Date: Thu, 29 Dec 2022 13:43:27 +0800
|
|
Subject: [PATCH] iris: Retry DRM_IOCTL_I915_GEM_EXECBUFFER2 on ENOMEM
|
|
|
|
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.
|
|
|
|
Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/6851
|
|
(cherry picked from commit 35462bab70db7312b2960796344c37738c93ce91)
|
|
---
|
|
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 ec32d88cc9bc..8b49615a9901 100644
|
|
--- a/src/gallium/drivers/iris/iris_batch.c
|
|
+++ b/src/gallium/drivers/iris/iris_batch.c
|
|
@@ -987,9 +987,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);
|
|
|