Skip to content

Commit f002702

Browse files
mbrost05rodrigovivi
authored andcommitted
drm/xe: Hold a PM ref when GT TLB invalidations are inflight
Avoid GT TLB invalidation timeouts by holding a PM ref when invalidations are inflight. v2: - Drop PM ref before signaling fence (CI) v3: - Move invalidation_fence_signal helper in tlb timeout to previous patch (Matthew Auld) Fixes: dd08ebf ("drm/xe: Introduce a new DRM driver for Intel GPUs") Cc: Rodrigo Vivi <[email protected]> Cc: Nirmoy Das <[email protected]> Signed-off-by: Matthew Brost <[email protected]> Reviewed-by: Nirmoy Das <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] (cherry picked from commit 0a382f9) Requires: 46209ce5287b ("drm/xe: Add xe_gt_tlb_invalidation_fence_init helper") Requires: 0e414ab036e0 ("drm/xe: Drop xe_gt_tlb_invalidation_wait") Signed-off-by: Rodrigo Vivi <[email protected]>
1 parent 58bfe66 commit f002702

File tree

4 files changed

+29
-3
lines changed

4 files changed

+29
-3
lines changed

drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "xe_guc.h"
1414
#include "xe_guc_ct.h"
1515
#include "xe_mmio.h"
16+
#include "xe_pm.h"
1617
#include "xe_sriov.h"
1718
#include "xe_trace.h"
1819
#include "regs/xe_guc_regs.h"
@@ -41,6 +42,7 @@ __invalidation_fence_signal(struct xe_device *xe, struct xe_gt_tlb_invalidation_
4142
bool stack = test_bit(FENCE_STACK_BIT, &fence->base.flags);
4243

4344
trace_xe_gt_tlb_invalidation_fence_signal(xe, fence);
45+
xe_gt_tlb_invalidation_fence_fini(fence);
4446
dma_fence_signal(&fence->base);
4547
if (!stack)
4648
dma_fence_put(&fence->base);
@@ -263,8 +265,10 @@ int xe_gt_tlb_invalidation_ggtt(struct xe_gt *gt)
263265

264266
xe_gt_tlb_invalidation_fence_init(gt, &fence, true);
265267
ret = xe_gt_tlb_invalidation_guc(gt, &fence);
266-
if (ret < 0)
268+
if (ret < 0) {
269+
xe_gt_tlb_invalidation_fence_fini(&fence);
267270
return ret;
271+
}
268272

269273
xe_gt_tlb_invalidation_fence_wait(&fence);
270274
} else if (xe_device_uc_enabled(xe) && !xe_device_wedged(xe)) {
@@ -489,12 +493,15 @@ static const struct dma_fence_ops invalidation_fence_ops = {
489493
* @fence: TLB invalidation fence to initialize
490494
* @stack: fence is stack variable
491495
*
492-
* Initialize TLB invalidation fence for use
496+
* Initialize TLB invalidation fence for use. xe_gt_tlb_invalidation_fence_fini
497+
* must be called if fence is not signaled.
493498
*/
494499
void xe_gt_tlb_invalidation_fence_init(struct xe_gt *gt,
495500
struct xe_gt_tlb_invalidation_fence *fence,
496501
bool stack)
497502
{
503+
xe_pm_runtime_get_noresume(gt_to_xe(gt));
504+
498505
spin_lock_irq(&gt->tlb_invalidation.lock);
499506
dma_fence_init(&fence->base, &invalidation_fence_ops,
500507
&gt->tlb_invalidation.lock,
@@ -505,4 +512,16 @@ void xe_gt_tlb_invalidation_fence_init(struct xe_gt *gt,
505512
set_bit(FENCE_STACK_BIT, &fence->base.flags);
506513
else
507514
dma_fence_get(&fence->base);
515+
fence->gt = gt;
516+
}
517+
518+
/**
519+
* xe_gt_tlb_invalidation_fence_fini - Finalize TLB invalidation fence
520+
* @fence: TLB invalidation fence to finalize
521+
*
522+
* Drop PM ref which fence took durinig init.
523+
*/
524+
void xe_gt_tlb_invalidation_fence_fini(struct xe_gt_tlb_invalidation_fence *fence)
525+
{
526+
xe_pm_runtime_put(gt_to_xe(fence->gt));
508527
}

drivers/gpu/drm/xe/xe_gt_tlb_invalidation.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ int xe_guc_tlb_invalidation_done_handler(struct xe_guc *guc, u32 *msg, u32 len);
2828
void xe_gt_tlb_invalidation_fence_init(struct xe_gt *gt,
2929
struct xe_gt_tlb_invalidation_fence *fence,
3030
bool stack);
31+
void xe_gt_tlb_invalidation_fence_fini(struct xe_gt_tlb_invalidation_fence *fence);
3132

3233
static inline void
3334
xe_gt_tlb_invalidation_fence_wait(struct xe_gt_tlb_invalidation_fence *fence)

drivers/gpu/drm/xe/xe_gt_tlb_invalidation_types.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
#include <linux/dma-fence.h>
1010

11+
struct xe_gt;
12+
1113
/**
1214
* struct xe_gt_tlb_invalidation_fence - XE GT TLB invalidation fence
1315
*
@@ -17,6 +19,8 @@
1719
struct xe_gt_tlb_invalidation_fence {
1820
/** @base: dma fence base */
1921
struct dma_fence base;
22+
/** @gt: GT which fence belong to */
23+
struct xe_gt *gt;
2024
/** @link: link into list of pending tlb fences */
2125
struct list_head link;
2226
/** @seqno: seqno of TLB invalidation to signal fence one */

drivers/gpu/drm/xe/xe_vm.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3379,8 +3379,10 @@ int xe_vm_invalidate_vma(struct xe_vma *vma)
33793379
*/
33803380
ret = xe_gt_tlb_invalidation_vma(tile->primary_gt,
33813381
&fence[id], vma);
3382-
if (ret < 0)
3382+
if (ret < 0) {
3383+
xe_gt_tlb_invalidation_fence_fini(&fence[id]);
33833384
goto wait;
3385+
}
33843386

33853387
tile_needs_invalidate |= BIT(id);
33863388
}

0 commit comments

Comments
 (0)