diff --git a/src/gallium/drivers/iris/xe/iris_kmd_backend.c b/src/gallium/drivers/iris/xe/iris_kmd_backend.c
index ae0f00641ef37658d567e882013bd11ce6744743..0543a786f31c674238474a0dde0ea5496c883885 100644
--- a/src/gallium/drivers/iris/xe/iris_kmd_backend.c
+++ b/src/gallium/drivers/iris/xe/iris_kmd_backend.c
@@ -259,8 +259,12 @@ xe_batch_submit(struct iris_batch *batch)
       .syncs = (uintptr_t)syncs,
       .num_syncs = sync_len,
    };
-   if (!batch->screen->devinfo->no_hw)
-       ret = intel_ioctl(iris_bufmgr_get_fd(bufmgr), DRM_IOCTL_XE_EXEC, &exec);
+   if (!batch->screen->devinfo->no_hw) {
+      uint8_t tries = 3;
+      do {
+         ret = intel_ioctl(iris_bufmgr_get_fd(bufmgr), DRM_IOCTL_XE_EXEC, &exec);
+      } while (ret && tries-- && (ret == -ENOMEM || ret == -EPERM));
+   }
 
    simple_mtx_unlock(bo_deps_lock);