diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index 42619fc05de48..97e014f94002e 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -847,9 +847,12 @@ static int __eb_add_lut(struct i915_execbuffer *eb,
 	if (unlikely(!lut))
 		return -ENOMEM;
 
+	if (!i915_vma_open(vma)) {
+		err = -EEXIST;	/* let eb_vma_lookup() retry */
+		goto err_lut_free;
+	}
+
 	i915_vma_get(vma);
-	if (!atomic_fetch_inc(&vma->open_count))
-		i915_vma_reopen(vma);
 	lut->handle = handle;
 	lut->ctx = ctx;
 
@@ -880,8 +883,9 @@ static int __eb_add_lut(struct i915_execbuffer *eb,
 	return 0;
 
 err:
-	i915_vma_close(vma);
 	i915_vma_put(vma);
+	i915_vma_close(vma);
+err_lut_free:
 	i915_lut_handle_free(lut);
 	return err;
 }
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
index d2f064d2525cc..4435c76f28c8c 100644
--- a/drivers/gpu/drm/i915/i915_vma.c
+++ b/drivers/gpu/drm/i915/i915_vma.c
@@ -1735,14 +1735,33 @@ static void __i915_vma_remove_closed(struct i915_vma *vma)
 	list_del_init(&vma->closed_link);
 }
 
-void i915_vma_reopen(struct i915_vma *vma)
+static struct i915_vma *i915_vma_reopen(struct i915_vma *vma)
+{
+	if (atomic_read(&vma->flags) & I915_VMA_PARKED)
+		return NULL;
+
+	__i915_vma_remove_closed(vma);
+	return vma;
+}
+
+struct i915_vma *i915_vma_open(struct i915_vma *vma)
 {
 	struct intel_gt *gt = vma->vm->gt;
 
+	if (atomic_inc_not_zero(&vma->open_count))
+		return vma;
+
 	spin_lock_irq(&gt->closed_lock);
-	if (i915_vma_is_closed(vma))
-		__i915_vma_remove_closed(vma);
+	if (!atomic_inc_not_zero(&vma->open_count)) {
+		if (i915_vma_is_closed(vma))
+			vma = i915_vma_reopen(vma);
+
+		if (vma)
+			atomic_inc(&vma->open_count);
+	}
 	spin_unlock_irq(&gt->closed_lock);
+
+	return vma;
 }
 
 static void force_unbind(struct i915_vma *vma)
@@ -1770,7 +1789,8 @@ static void release_references(struct i915_vma *vma, struct intel_gt *gt,
 	spin_unlock(&obj->vma.lock);
 
 	spin_lock_irq(&gt->closed_lock);
-	__i915_vma_remove_closed(vma);
+	if (!(atomic_read(&vma->flags) & I915_VMA_PARKED))
+		__i915_vma_remove_closed(vma);
 	spin_unlock_irq(&gt->closed_lock);
 
 	if (vm_ddestroy)
@@ -1854,22 +1874,22 @@ void i915_vma_parked(struct intel_gt *gt)
 		}
 
 		list_move(&vma->closed_link, &closed);
+		atomic_or(I915_VMA_PARKED, &vma->flags);
 	}
 	spin_unlock_irq(&gt->closed_lock);
 
-	/* As the GT is held idle, no vma can be reopened as we destroy them */
 	list_for_each_entry_safe(vma, next, &closed, closed_link) {
 		struct drm_i915_gem_object *obj = vma->obj;
 		struct i915_address_space *vm = vma->vm;
 
 		if (i915_gem_object_trylock(obj, NULL)) {
-			INIT_LIST_HEAD(&vma->closed_link);
 			i915_vma_destroy(vma);
 			i915_gem_object_unlock(obj);
 		} else {
 			/* back you go.. */
 			spin_lock_irq(&gt->closed_lock);
 			list_add(&vma->closed_link, &gt->closed_vma);
+			atomic_andnot(I915_VMA_PARKED, &vma->flags);
 			spin_unlock_irq(&gt->closed_lock);
 		}
 
diff --git a/drivers/gpu/drm/i915/i915_vma.h b/drivers/gpu/drm/i915/i915_vma.h
index e356dfb883d34..331d19672c764 100644
--- a/drivers/gpu/drm/i915/i915_vma.h
+++ b/drivers/gpu/drm/i915/i915_vma.h
@@ -268,7 +268,7 @@ int __must_check i915_vma_unbind_async(struct i915_vma *vma, bool trylock_vm);
 int __must_check i915_vma_unbind_unlocked(struct i915_vma *vma);
 void i915_vma_unlink_ctx(struct i915_vma *vma);
 void i915_vma_close(struct i915_vma *vma);
-void i915_vma_reopen(struct i915_vma *vma);
+struct i915_vma *i915_vma_open(struct i915_vma *vma);
 
 void i915_vma_destroy_locked(struct i915_vma *vma);
 void i915_vma_destroy(struct i915_vma *vma);
diff --git a/drivers/gpu/drm/i915/i915_vma_types.h b/drivers/gpu/drm/i915/i915_vma_types.h
index 559de74d0b114..41784c3025349 100644
--- a/drivers/gpu/drm/i915/i915_vma_types.h
+++ b/drivers/gpu/drm/i915/i915_vma_types.h
@@ -263,6 +263,9 @@ struct i915_vma {
 #define I915_VMA_SCANOUT_BIT	17
 #define I915_VMA_SCANOUT	((int)BIT(I915_VMA_SCANOUT_BIT))
 
+#define I915_VMA_PARKED_BIT	18
+#define I915_VMA_PARKED		((int)BIT(I915_VMA_PARKED_BIT))
+
 	struct i915_active active;
 
 #define I915_VMA_PAGES_BIAS 24
