drm/xe: Add TLB invalidation fence ftrace
authorMatthew Brost <matthew.brost@intel.com>
Fri, 20 Jan 2023 03:21:35 +0000 (19:21 -0800)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 19 Dec 2023 23:27:46 +0000 (18:27 -0500)
This will help debug issues with TLB invalidation fences.

Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c
drivers/gpu/drm/xe/xe_pt.c
drivers/gpu/drm/xe/xe_trace.h

index 1cb4d3a6bc57a0fa9bf327c3aef2d6d29cff51f4..4d179357ce65dd92aaadd2b361782ac8abe69414 100644 (file)
@@ -7,6 +7,7 @@
 #include "xe_gt_tlb_invalidation.h"
 #include "xe_guc.h"
 #include "xe_guc_ct.h"
+#include "xe_trace.h"
 
 static struct xe_gt *
 guc_to_gt(struct xe_guc *guc)
@@ -82,6 +83,7 @@ static int send_tlb_invalidation(struct xe_guc *guc,
                fence->seqno = seqno;
                list_add_tail(&fence->link,
                              &gt->tlb_invalidation.pending_fences);
+               trace_xe_gt_tlb_invalidation_fence_send(fence);
        }
        action[1] = seqno;
        gt->tlb_invalidation.seqno = (gt->tlb_invalidation.seqno + 1) %
@@ -194,7 +196,10 @@ int xe_guc_tlb_invalidation_done_handler(struct xe_guc *guc, u32 *msg, u32 len)
 
        fence = list_first_entry_or_null(&gt->tlb_invalidation.pending_fences,
                                         typeof(*fence), link);
+       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);
                dma_fence_signal(&fence->base);
                dma_fence_put(&fence->base);
index 65a6f54b22a9bb804f177182ba80a991249196f1..b220d1d5cfe369632fb8cf820f406a5ee439cc51 100644 (file)
@@ -13,6 +13,7 @@
 #include "xe_pt_walk.h"
 #include "xe_vm.h"
 #include "xe_res_cursor.h"
+#include "xe_trace.h"
 #include "xe_ttm_stolen_mgr.h"
 
 struct xe_pt_dir {
@@ -1493,6 +1494,7 @@ static void invalidation_fence_cb(struct dma_fence *fence,
        struct invalidation_fence *ifence =
                container_of(cb, struct invalidation_fence, cb);
 
+       trace_xe_gt_tlb_invalidation_fence_cb(&ifence->base);
        queue_work(system_wq, &ifence->work);
        dma_fence_put(ifence->fence);
 }
@@ -1502,6 +1504,7 @@ static void invalidation_fence_work_func(struct work_struct *w)
        struct invalidation_fence *ifence =
                container_of(w, struct invalidation_fence, work);
 
+       trace_xe_gt_tlb_invalidation_fence_work_func(&ifence->base);
        xe_gt_tlb_invalidation(ifence->gt, &ifence->base);
 }
 
@@ -1511,6 +1514,8 @@ static int invalidation_fence_init(struct xe_gt *gt,
 {
        int ret;
 
+       trace_xe_gt_tlb_invalidation_fence_create(&ifence->base);
+
        spin_lock_irq(&gt->tlb_invalidation.lock);
        dma_fence_init(&ifence->base.base, &invalidation_fence_ops,
                       &gt->tlb_invalidation.lock,
index d9f921d46b53ffd4023d2c10f3150c5de5d98db5..b5b0f1bff7ec87ce3bb2fe75e8255388a8cb0f86 100644 (file)
 #include "xe_engine_types.h"
 #include "xe_gpu_scheduler_types.h"
 #include "xe_gt_types.h"
+#include "xe_gt_tlb_invalidation_types.h"
 #include "xe_guc_engine_types.h"
 #include "xe_sched_job.h"
 #include "xe_vm_types.h"
 
+DECLARE_EVENT_CLASS(xe_gt_tlb_invalidation_fence,
+                   TP_PROTO(struct xe_gt_tlb_invalidation_fence *fence),
+                   TP_ARGS(fence),
+
+                   TP_STRUCT__entry(
+                            __field(u64, fence)
+                            __field(int, seqno)
+                            ),
+
+                   TP_fast_assign(
+                          __entry->fence = (u64)fence;
+                          __entry->seqno = fence->seqno;
+                          ),
+
+                   TP_printk("fence=0x%016llx, seqno=%d",
+                             __entry->fence, __entry->seqno)
+);
+
+DEFINE_EVENT(xe_gt_tlb_invalidation_fence, xe_gt_tlb_invalidation_fence_create,
+            TP_PROTO(struct xe_gt_tlb_invalidation_fence *fence),
+            TP_ARGS(fence)
+);
+
+DEFINE_EVENT(xe_gt_tlb_invalidation_fence,
+            xe_gt_tlb_invalidation_fence_work_func,
+            TP_PROTO(struct xe_gt_tlb_invalidation_fence *fence),
+            TP_ARGS(fence)
+);
+
+DEFINE_EVENT(xe_gt_tlb_invalidation_fence, xe_gt_tlb_invalidation_fence_cb,
+            TP_PROTO(struct xe_gt_tlb_invalidation_fence *fence),
+            TP_ARGS(fence)
+);
+
+DEFINE_EVENT(xe_gt_tlb_invalidation_fence, xe_gt_tlb_invalidation_fence_send,
+            TP_PROTO(struct xe_gt_tlb_invalidation_fence *fence),
+            TP_ARGS(fence)
+);
+
+DEFINE_EVENT(xe_gt_tlb_invalidation_fence, xe_gt_tlb_invalidation_fence_recv,
+            TP_PROTO(struct xe_gt_tlb_invalidation_fence *fence),
+            TP_ARGS(fence)
+);
+
+DEFINE_EVENT(xe_gt_tlb_invalidation_fence, xe_gt_tlb_invalidation_fence_signal,
+            TP_PROTO(struct xe_gt_tlb_invalidation_fence *fence),
+            TP_ARGS(fence)
+);
+
 DECLARE_EVENT_CLASS(xe_bo,
                    TP_PROTO(struct xe_bo *bo),
                    TP_ARGS(bo),