diff --git a/src/gallium/drivers/iris/xe/iris_kmd_backend.c b/src/gallium/drivers/iris/xe/iris_kmd_backend.c
index e753ccba917ba75bfe4becda0c44d2035ee04dc2..f04f9e6d10376ca42721657e43461a0f5c8802e8 100644
--- a/src/gallium/drivers/iris/xe/iris_kmd_backend.c
+++ b/src/gallium/drivers/iris/xe/iris_kmd_backend.c
@@ -388,8 +388,19 @@ 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);
+         if (ret == 0)
+            break;
+
+         ret = -errno;
+
+         if (!(ret == -ENOMEM || ret == -EPERM))
+            break;
+      } while (--tries);
+   }
 
    if (ret) {
       ret = -errno;