return hw_tlb_timeout + 2 * delay;
 }
 
+static void xe_gt_tlb_invalidation_fence_fini(struct xe_gt_tlb_invalidation_fence *fence)
+{
+       if (WARN_ON_ONCE(!fence->gt))
+               return;
+
+       xe_pm_runtime_put(gt_to_xe(fence->gt));
+       fence->gt = NULL; /* fini() should be called once */
+}
+
 static void
 __invalidation_fence_signal(struct xe_device *xe, struct xe_gt_tlb_invalidation_fence *fence)
 {
                                                   tlb_timeout_jiffies(gt));
                }
                spin_unlock_irq(>->tlb_invalidation.pending_lock);
-       } else if (ret < 0) {
+       } else {
                __invalidation_fence_signal(xe, fence);
        }
        if (!ret) {
 
                xe_gt_tlb_invalidation_fence_init(gt, &fence, true);
                ret = xe_gt_tlb_invalidation_guc(gt, &fence);
-               if (ret < 0) {
-                       xe_gt_tlb_invalidation_fence_fini(&fence);
+               if (ret)
                        return ret;
-               }
 
                xe_gt_tlb_invalidation_fence_wait(&fence);
        } else if (xe_device_uc_enabled(xe) && !xe_device_wedged(xe)) {
  * @stack: fence is stack variable
  *
  * Initialize TLB invalidation fence for use. xe_gt_tlb_invalidation_fence_fini
- * must be called if fence is not signaled.
+ * will be automatically called when fence is signalled (all fences must signal),
+ * even on error.
  */
 void xe_gt_tlb_invalidation_fence_init(struct xe_gt *gt,
                                       struct xe_gt_tlb_invalidation_fence *fence,
                dma_fence_get(&fence->base);
        fence->gt = gt;
 }
-
-/**
- * xe_gt_tlb_invalidation_fence_fini - Finalize TLB invalidation fence
- * @fence: TLB invalidation fence to finalize
- *
- * Drop PM ref which fence took durinig init.
- */
-void xe_gt_tlb_invalidation_fence_fini(struct xe_gt_tlb_invalidation_fence *fence)
-{
-       xe_pm_runtime_put(gt_to_xe(fence->gt));
-}
 
 
                        ret = xe_gt_tlb_invalidation_vma(tile->primary_gt,
                                                         &fence[fence_id], vma);
-                       if (ret < 0) {
-                               xe_gt_tlb_invalidation_fence_fini(&fence[fence_id]);
+                       if (ret)
                                goto wait;
-                       }
                        ++fence_id;
 
                        if (!tile->media_gt)
 
                        ret = xe_gt_tlb_invalidation_vma(tile->media_gt,
                                                         &fence[fence_id], vma);
-                       if (ret < 0) {
-                               xe_gt_tlb_invalidation_fence_fini(&fence[fence_id]);
+                       if (ret)
                                goto wait;
-                       }
                        ++fence_id;
                }
        }