diff --git a/src/gallium/drivers/iris/xe/iris_kmd_backend.c b/src/gallium/drivers/iris/xe/iris_kmd_backend.c
index 12a8d7e545d3eeebc2e2376be03937d133cdda65..9281a5927f5c68299fc1323cbd87d0f0dffb4281 100644
--- a/src/gallium/drivers/iris/xe/iris_kmd_backend.c
+++ b/src/gallium/drivers/iris/xe/iris_kmd_backend.c
@@ -391,8 +391,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));
+   }
 
    if (ret)
       goto error_exec;