drm/i915: Add dynamic page trace events
authorMichel Thierry <michel.thierry@intel.com>
Tue, 24 Mar 2015 15:46:23 +0000 (15:46 +0000)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 27 Mar 2015 08:25:44 +0000 (09:25 +0100)
Traces for page directories and tables allocation and map.

v2: Removed references to teardown.
v3: bitmap_scnprintf has been deprecated.
v4: Replace bitmap_scnprintf with scnprintf correctly, and get right
range lengths. (Mika)

Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Michel Thierry <michel.thierry@intel.com>
Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/i915_trace.h

index 538cae2ca94e5cdfcd58f1a5c7660372b2114311..c13e65994654e5eab7068938a915d4675450549f 100644 (file)
@@ -3512,6 +3512,8 @@ search_free:
 
        /*  allocate before insert / bind */
        if (vma->vm->allocate_va_range) {
+               trace_i915_va_alloc(vma->vm, vma->node.start, vma->node.size,
+                               VM_TO_TRACE_NAME(vma->vm));
                ret = vma->vm->allocate_va_range(vma->vm,
                                                vma->node.start,
                                                vma->node.size);
index 641d3f45aa1e215aaa9d5ce1d195d6139bad9850..e33b1214c4d8fd85694db9b8778ecc42ec43c0a3 100644 (file)
@@ -1225,6 +1225,7 @@ static int gen6_alloc_va_range(struct i915_address_space *vm,
 
                ppgtt->pd.page_table[pde] = pt;
                set_bit(pde, new_page_tables);
+               trace_i915_page_table_entry_alloc(vm, pde, start, GEN6_PDE_SHIFT);
        }
 
        start = start_save;
@@ -1240,6 +1241,10 @@ static int gen6_alloc_va_range(struct i915_address_space *vm,
                if (test_and_clear_bit(pde, new_page_tables))
                        gen6_write_pde(&ppgtt->pd, pde, pt);
 
+               trace_i915_page_table_entry_map(vm, pde, pt,
+                                        gen6_pte_index(start),
+                                        gen6_pte_count(start, length),
+                                        GEN6_PTES);
                bitmap_or(pt->used_ptes, tmp_bitmap, pt->used_ptes,
                                GEN6_PTES);
        }
index f004d3d89b87ec41be8acbc5aec1d0991bad6fce..b3070a4501ab59e3009758cb9ab624af8343a258 100644 (file)
@@ -156,6 +156,105 @@ TRACE_EVENT(i915_vma_unbind,
                      __entry->obj, __entry->offset, __entry->size, __entry->vm)
 );
 
+#define VM_TO_TRACE_NAME(vm) \
+       (i915_is_ggtt(vm) ? "G" : \
+                     "P")
+
+DECLARE_EVENT_CLASS(i915_va,
+       TP_PROTO(struct i915_address_space *vm, u64 start, u64 length, const char *name),
+       TP_ARGS(vm, start, length, name),
+
+       TP_STRUCT__entry(
+               __field(struct i915_address_space *, vm)
+               __field(u64, start)
+               __field(u64, end)
+               __string(name, name)
+       ),
+
+       TP_fast_assign(
+               __entry->vm = vm;
+               __entry->start = start;
+               __entry->end = start + length - 1;
+               __assign_str(name, name);
+       ),
+
+       TP_printk("vm=%p (%s), 0x%llx-0x%llx",
+                 __entry->vm, __get_str(name),  __entry->start, __entry->end)
+);
+
+DEFINE_EVENT(i915_va, i915_va_alloc,
+            TP_PROTO(struct i915_address_space *vm, u64 start, u64 length, const char *name),
+            TP_ARGS(vm, start, length, name)
+);
+
+DECLARE_EVENT_CLASS(i915_page_table_entry,
+       TP_PROTO(struct i915_address_space *vm, u32 pde, u64 start, u64 pde_shift),
+       TP_ARGS(vm, pde, start, pde_shift),
+
+       TP_STRUCT__entry(
+               __field(struct i915_address_space *, vm)
+               __field(u32, pde)
+               __field(u64, start)
+               __field(u64, end)
+       ),
+
+       TP_fast_assign(
+               __entry->vm = vm;
+               __entry->pde = pde;
+               __entry->start = start;
+               __entry->end = ((start + (1ULL << pde_shift)) & ~((1ULL << pde_shift)-1)) - 1;
+       ),
+
+       TP_printk("vm=%p, pde=%d (0x%llx-0x%llx)",
+                 __entry->vm, __entry->pde, __entry->start, __entry->end)
+);
+
+DEFINE_EVENT(i915_page_table_entry, i915_page_table_entry_alloc,
+            TP_PROTO(struct i915_address_space *vm, u32 pde, u64 start, u64 pde_shift),
+            TP_ARGS(vm, pde, start, pde_shift)
+);
+
+/* Avoid extra math because we only support two sizes. The format is defined by
+ * bitmap_scnprintf. Each 32 bits is 8 HEX digits followed by comma */
+#define TRACE_PT_SIZE(bits) \
+       ((((bits) == 1024) ? 288 : 144) + 1)
+
+DECLARE_EVENT_CLASS(i915_page_table_entry_update,
+       TP_PROTO(struct i915_address_space *vm, u32 pde,
+                struct i915_page_table_entry *pt, u32 first, u32 count, u32 bits),
+       TP_ARGS(vm, pde, pt, first, count, bits),
+
+       TP_STRUCT__entry(
+               __field(struct i915_address_space *, vm)
+               __field(u32, pde)
+               __field(u32, first)
+               __field(u32, last)
+               __dynamic_array(char, cur_ptes, TRACE_PT_SIZE(bits))
+       ),
+
+       TP_fast_assign(
+               __entry->vm = vm;
+               __entry->pde = pde;
+               __entry->first = first;
+               __entry->last = first + count - 1;
+               scnprintf(__get_str(cur_ptes),
+                         TRACE_PT_SIZE(bits),
+                         "%*pb",
+                         bits,
+                         pt->used_ptes);
+       ),
+
+       TP_printk("vm=%p, pde=%d, updating %u:%u\t%s",
+                 __entry->vm, __entry->pde, __entry->last, __entry->first,
+                 __get_str(cur_ptes))
+);
+
+DEFINE_EVENT(i915_page_table_entry_update, i915_page_table_entry_map,
+       TP_PROTO(struct i915_address_space *vm, u32 pde,
+                struct i915_page_table_entry *pt, u32 first, u32 count, u32 bits),
+       TP_ARGS(vm, pde, pt, first, count, bits)
+);
+
 TRACE_EVENT(i915_gem_object_change_domain,
            TP_PROTO(struct drm_i915_gem_object *obj, u32 old_read, u32 old_write),
            TP_ARGS(obj, old_read, old_write),