mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 03:53:37 +02:00
drm/xe: Signal invalidation fence immediately if CT send fails
This means we are in the middle of a GT reset and no need to do TLB invalidation so just signal invalidation fence immediately. Signed-off-by: Matthew Brost <matthew.brost@intel.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Reviewed-by: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
This commit is contained in:
parent
bae8ddae18
commit
9f9f09d407
|
|
@ -69,6 +69,15 @@ int xe_gt_tlb_invalidation_init(struct xe_gt *gt)
|
|||
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
|
||||
|
|
@ -83,11 +92,8 @@ int xe_gt_tlb_invalidation_init(struct xe_gt *gt)
|
|||
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
@ -130,6 +136,8 @@ static int send_tlb_invalidation(struct xe_guc *guc,
|
|||
}
|
||||
if (!ret)
|
||||
ret = seqno;
|
||||
if (ret < 0 && fence)
|
||||
invalidation_fence_signal(fence);
|
||||
mutex_unlock(&guc->ct.lock);
|
||||
|
||||
return ret;
|
||||
|
|
@ -321,16 +329,13 @@ int xe_guc_tlb_invalidation_done_handler(struct xe_guc *guc, u32 *msg, u32 len)
|
|||
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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user