mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 10:33:41 +02:00
drm/xe: Add xe_tlb_inval_idle helper
Introduce the xe_tlb_inval_idle helper to detect whether any TLB invalidations are currently in flight. This is used in context-based TLB invalidations to determine whether dummy TLB invalidations need to be sent to maintain proper TLB invalidation fence ordering.. v2: - Implement xe_tlb_inval_idle based on pending list Signed-off-by: Matthew Brost <matthew.brost@intel.com> Reviewed-by: Stuart Summers <stuart.summers@intel.com> Tested-by: Stuart Summers <stuart.summers@intel.com> Link: https://patch.msgid.link/20260116221731.868657-10-matthew.brost@intel.com
This commit is contained in:
parent
2d93d5d530
commit
6b42b635d6
|
|
@ -41,11 +41,14 @@ static void xe_tlb_inval_fence_fini(struct xe_tlb_inval_fence *fence)
|
|||
static void
|
||||
xe_tlb_inval_fence_signal(struct xe_tlb_inval_fence *fence)
|
||||
{
|
||||
struct xe_tlb_inval *tlb_inval = fence->tlb_inval;
|
||||
bool stack = test_bit(FENCE_STACK_BIT, &fence->base.flags);
|
||||
|
||||
lockdep_assert_held(&fence->tlb_inval->pending_lock);
|
||||
|
||||
list_del(&fence->link);
|
||||
if (list_empty(&tlb_inval->pending_fences))
|
||||
cancel_delayed_work(&tlb_inval->fence_tdr);
|
||||
trace_xe_tlb_inval_fence_signal(fence->tlb_inval->xe, fence);
|
||||
xe_tlb_inval_fence_fini(fence);
|
||||
dma_fence_signal(&fence->base);
|
||||
|
|
@ -465,3 +468,21 @@ void xe_tlb_inval_fence_init(struct xe_tlb_inval *tlb_inval,
|
|||
dma_fence_get(&fence->base);
|
||||
fence->tlb_inval = tlb_inval;
|
||||
}
|
||||
|
||||
/**
|
||||
* xe_tlb_inval_idle() - Initialize TLB invalidation is idle
|
||||
* @tlb_inval: TLB invalidation client
|
||||
*
|
||||
* Check the TLB invalidation seqno to determine if it is idle (i.e., no TLB
|
||||
* invalidations are in flight). Expected to be called in the backend after the
|
||||
* fence has been added to the pending list, and takes this into account.
|
||||
*
|
||||
* Return: True if TLB invalidation client is idle, False otherwise
|
||||
*/
|
||||
bool xe_tlb_inval_idle(struct xe_tlb_inval *tlb_inval)
|
||||
{
|
||||
lockdep_assert_held(&tlb_inval->seqno_lock);
|
||||
|
||||
guard(spinlock_irq)(&tlb_inval->pending_lock);
|
||||
return list_is_singular(&tlb_inval->pending_fences);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,4 +43,6 @@ xe_tlb_inval_fence_wait(struct xe_tlb_inval_fence *fence)
|
|||
|
||||
void xe_tlb_inval_done_handler(struct xe_tlb_inval *tlb_inval, int seqno);
|
||||
|
||||
bool xe_tlb_inval_idle(struct xe_tlb_inval *tlb_inval);
|
||||
|
||||
#endif /* _XE_TLB_INVAL_ */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user