return 0;
}
+static void
+invalidation_fence_signal(struct xe_gt_tlb_invalidation_fence *fence)
+{
+ trace_xe_gt_tlb_invalidation_fence_signal(fence);
+ list_del(&fence->link);
+ dma_fence_signal(&fence->base);
+ dma_fence_put(&fence->base);
+}
+
/**
* xe_gt_tlb_invalidation_reset - Initialize GT TLB invalidation reset
* @gt: graphics tile
mutex_lock(>->uc.guc.ct.lock);
list_for_each_entry_safe(fence, next,
- >->tlb_invalidation.pending_fences, link) {
- list_del(&fence->link);
- dma_fence_signal(&fence->base);
- dma_fence_put(&fence->base);
- }
+ >->tlb_invalidation.pending_fences, link)
+ invalidation_fence_signal(fence);
mutex_unlock(>->uc.guc.ct.lock);
}
}
if (!ret)
ret = seqno;
+ if (ret < 0 && fence)
+ invalidation_fence_signal(fence);
mutex_unlock(&guc->ct.lock);
return ret;
if (fence)
trace_xe_gt_tlb_invalidation_fence_recv(fence);
if (fence && tlb_invalidation_seqno_past(gt, fence->seqno)) {
- trace_xe_gt_tlb_invalidation_fence_signal(fence);
- list_del(&fence->link);
+ invalidation_fence_signal(fence);
if (!list_empty(>->tlb_invalidation.pending_fences))
mod_delayed_work(system_wq,
>->tlb_invalidation.fence_tdr,
TLB_TIMEOUT);
else
cancel_delayed_work(>->tlb_invalidation.fence_tdr);
- dma_fence_signal(&fence->base);
- dma_fence_put(&fence->base);
}
return 0;