@@ -37,6 +37,15 @@ static long tlb_timeout_jiffies(struct xe_gt *gt)
3737 return hw_tlb_timeout + 2 * delay ;
3838}
3939
40+ static void xe_gt_tlb_invalidation_fence_fini (struct xe_gt_tlb_invalidation_fence * fence )
41+ {
42+ if (WARN_ON_ONCE (!fence -> gt ))
43+ return ;
44+
45+ xe_pm_runtime_put (gt_to_xe (fence -> gt ));
46+ fence -> gt = NULL ; /* fini() should be called once */
47+ }
48+
4049static void
4150__invalidation_fence_signal (struct xe_device * xe , struct xe_gt_tlb_invalidation_fence * fence )
4251{
@@ -204,7 +213,7 @@ static int send_tlb_invalidation(struct xe_guc *guc,
204213 tlb_timeout_jiffies (gt ));
205214 }
206215 spin_unlock_irq (& gt -> tlb_invalidation .pending_lock );
207- } else if ( ret < 0 ) {
216+ } else {
208217 __invalidation_fence_signal (xe , fence );
209218 }
210219 if (!ret ) {
@@ -267,10 +276,8 @@ int xe_gt_tlb_invalidation_ggtt(struct xe_gt *gt)
267276
268277 xe_gt_tlb_invalidation_fence_init (gt , & fence , true);
269278 ret = xe_gt_tlb_invalidation_guc (gt , & fence );
270- if (ret < 0 ) {
271- xe_gt_tlb_invalidation_fence_fini (& fence );
279+ if (ret )
272280 return ret ;
273- }
274281
275282 xe_gt_tlb_invalidation_fence_wait (& fence );
276283 } else if (xe_device_uc_enabled (xe ) && !xe_device_wedged (xe )) {
@@ -496,7 +503,8 @@ static const struct dma_fence_ops invalidation_fence_ops = {
496503 * @stack: fence is stack variable
497504 *
498505 * Initialize TLB invalidation fence for use. xe_gt_tlb_invalidation_fence_fini
499- * must be called if fence is not signaled.
506+ * will be automatically called when fence is signalled (all fences must signal),
507+ * even on error.
500508 */
501509void xe_gt_tlb_invalidation_fence_init (struct xe_gt * gt ,
502510 struct xe_gt_tlb_invalidation_fence * fence ,
@@ -516,14 +524,3 @@ void xe_gt_tlb_invalidation_fence_init(struct xe_gt *gt,
516524 dma_fence_get (& fence -> base );
517525 fence -> gt = gt ;
518526}
519-
520- /**
521- * xe_gt_tlb_invalidation_fence_fini - Finalize TLB invalidation fence
522- * @fence: TLB invalidation fence to finalize
523- *
524- * Drop PM ref which fence took durinig init.
525- */
526- void xe_gt_tlb_invalidation_fence_fini (struct xe_gt_tlb_invalidation_fence * fence )
527- {
528- xe_pm_runtime_put (gt_to_xe (fence -> gt ));
529- }
0 commit comments