diff options
| author | Michel Thierry <michel.thierry@intel.com> | 2015-03-24 11:46:23 -0400 |
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2015-03-27 04:25:44 -0400 |
| commit | 72744cb13c9ccc248331462f35468398160338bf (patch) | |
| tree | 5b336e6441449e8cf877be67a98da0ef35395aa3 | |
| parent | 4933d51955aca6d2b05da5a7afe25f156016dfa8 (diff) | |
drm/i915: Add dynamic page trace events
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>
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_trace.h | 99 |
3 files changed, 106 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 538cae2ca94e..c13e65994654 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -3512,6 +3512,8 @@ search_free: | |||
| 3512 | 3512 | ||
| 3513 | /* allocate before insert / bind */ | 3513 | /* allocate before insert / bind */ |
| 3514 | if (vma->vm->allocate_va_range) { | 3514 | if (vma->vm->allocate_va_range) { |
| 3515 | trace_i915_va_alloc(vma->vm, vma->node.start, vma->node.size, | ||
| 3516 | VM_TO_TRACE_NAME(vma->vm)); | ||
| 3515 | ret = vma->vm->allocate_va_range(vma->vm, | 3517 | ret = vma->vm->allocate_va_range(vma->vm, |
| 3516 | vma->node.start, | 3518 | vma->node.start, |
| 3517 | vma->node.size); | 3519 | vma->node.size); |
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 641d3f45aa1e..e33b1214c4d8 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
| @@ -1225,6 +1225,7 @@ static int gen6_alloc_va_range(struct i915_address_space *vm, | |||
| 1225 | 1225 | ||
| 1226 | ppgtt->pd.page_table[pde] = pt; | 1226 | ppgtt->pd.page_table[pde] = pt; |
| 1227 | set_bit(pde, new_page_tables); | 1227 | set_bit(pde, new_page_tables); |
| 1228 | trace_i915_page_table_entry_alloc(vm, pde, start, GEN6_PDE_SHIFT); | ||
| 1228 | } | 1229 | } |
| 1229 | 1230 | ||
| 1230 | start = start_save; | 1231 | start = start_save; |
| @@ -1240,6 +1241,10 @@ static int gen6_alloc_va_range(struct i915_address_space *vm, | |||
| 1240 | if (test_and_clear_bit(pde, new_page_tables)) | 1241 | if (test_and_clear_bit(pde, new_page_tables)) |
| 1241 | gen6_write_pde(&ppgtt->pd, pde, pt); | 1242 | gen6_write_pde(&ppgtt->pd, pde, pt); |
| 1242 | 1243 | ||
| 1244 | trace_i915_page_table_entry_map(vm, pde, pt, | ||
| 1245 | gen6_pte_index(start), | ||
| 1246 | gen6_pte_count(start, length), | ||
| 1247 | GEN6_PTES); | ||
| 1243 | bitmap_or(pt->used_ptes, tmp_bitmap, pt->used_ptes, | 1248 | bitmap_or(pt->used_ptes, tmp_bitmap, pt->used_ptes, |
| 1244 | GEN6_PTES); | 1249 | GEN6_PTES); |
| 1245 | } | 1250 | } |
diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h index f004d3d89b87..b3070a4501ab 100644 --- a/drivers/gpu/drm/i915/i915_trace.h +++ b/drivers/gpu/drm/i915/i915_trace.h | |||
| @@ -156,6 +156,105 @@ TRACE_EVENT(i915_vma_unbind, | |||
| 156 | __entry->obj, __entry->offset, __entry->size, __entry->vm) | 156 | __entry->obj, __entry->offset, __entry->size, __entry->vm) |
| 157 | ); | 157 | ); |
| 158 | 158 | ||
| 159 | #define VM_TO_TRACE_NAME(vm) \ | ||
| 160 | (i915_is_ggtt(vm) ? "G" : \ | ||
| 161 | "P") | ||
| 162 | |||
| 163 | DECLARE_EVENT_CLASS(i915_va, | ||
| 164 | TP_PROTO(struct i915_address_space *vm, u64 start, u64 length, const char *name), | ||
| 165 | TP_ARGS(vm, start, length, name), | ||
| 166 | |||
| 167 | TP_STRUCT__entry( | ||
| 168 | __field(struct i915_address_space *, vm) | ||
| 169 | __field(u64, start) | ||
| 170 | __field(u64, end) | ||
| 171 | __string(name, name) | ||
| 172 | ), | ||
| 173 | |||
| 174 | TP_fast_assign( | ||
| 175 | __entry->vm = vm; | ||
| 176 | __entry->start = start; | ||
| 177 | __entry->end = start + length - 1; | ||
| 178 | __assign_str(name, name); | ||
| 179 | ), | ||
| 180 | |||
| 181 | TP_printk("vm=%p (%s), 0x%llx-0x%llx", | ||
| 182 | __entry->vm, __get_str(name), __entry->start, __entry->end) | ||
| 183 | ); | ||
| 184 | |||
| 185 | DEFINE_EVENT(i915_va, i915_va_alloc, | ||
| 186 | TP_PROTO(struct i915_address_space *vm, u64 start, u64 length, const char *name), | ||
| 187 | TP_ARGS(vm, start, length, name) | ||
| 188 | ); | ||
| 189 | |||
| 190 | DECLARE_EVENT_CLASS(i915_page_table_entry, | ||
| 191 | TP_PROTO(struct i915_address_space *vm, u32 pde, u64 start, u64 pde_shift), | ||
| 192 | TP_ARGS(vm, pde, start, pde_shift), | ||
| 193 | |||
| 194 | TP_STRUCT__entry( | ||
| 195 | __field(struct i915_address_space *, vm) | ||
| 196 | __field(u32, pde) | ||
| 197 | __field(u64, start) | ||
| 198 | __field(u64, end) | ||
| 199 | ), | ||
| 200 | |||
| 201 | TP_fast_assign( | ||
| 202 | __entry->vm = vm; | ||
| 203 | __entry->pde = pde; | ||
| 204 | __entry->start = start; | ||
| 205 | __entry->end = ((start + (1ULL << pde_shift)) & ~((1ULL << pde_shift)-1)) - 1; | ||
| 206 | ), | ||
| 207 | |||
| 208 | TP_printk("vm=%p, pde=%d (0x%llx-0x%llx)", | ||
| 209 | __entry->vm, __entry->pde, __entry->start, __entry->end) | ||
| 210 | ); | ||
| 211 | |||
| 212 | DEFINE_EVENT(i915_page_table_entry, i915_page_table_entry_alloc, | ||
| 213 | TP_PROTO(struct i915_address_space *vm, u32 pde, u64 start, u64 pde_shift), | ||
| 214 | TP_ARGS(vm, pde, start, pde_shift) | ||
| 215 | ); | ||
| 216 | |||
| 217 | /* Avoid extra math because we only support two sizes. The format is defined by | ||
| 218 | * bitmap_scnprintf. Each 32 bits is 8 HEX digits followed by comma */ | ||
| 219 | #define TRACE_PT_SIZE(bits) \ | ||
| 220 | ((((bits) == 1024) ? 288 : 144) + 1) | ||
| 221 | |||
| 222 | DECLARE_EVENT_CLASS(i915_page_table_entry_update, | ||
| 223 | TP_PROTO(struct i915_address_space *vm, u32 pde, | ||
| 224 | struct i915_page_table_entry *pt, u32 first, u32 count, u32 bits), | ||
| 225 | TP_ARGS(vm, pde, pt, first, count, bits), | ||
| 226 | |||
| 227 | TP_STRUCT__entry( | ||
| 228 | __field(struct i915_address_space *, vm) | ||
| 229 | __field(u32, pde) | ||
| 230 | __field(u32, first) | ||
| 231 | __field(u32, last) | ||
| 232 | __dynamic_array(char, cur_ptes, TRACE_PT_SIZE(bits)) | ||
| 233 | ), | ||
| 234 | |||
| 235 | TP_fast_assign( | ||
| 236 | __entry->vm = vm; | ||
| 237 | __entry->pde = pde; | ||
| 238 | __entry->first = first; | ||
| 239 | __entry->last = first + count - 1; | ||
| 240 | scnprintf(__get_str(cur_ptes), | ||
| 241 | TRACE_PT_SIZE(bits), | ||
| 242 | "%*pb", | ||
| 243 | bits, | ||
| 244 | pt->used_ptes); | ||
| 245 | ), | ||
| 246 | |||
| 247 | TP_printk("vm=%p, pde=%d, updating %u:%u\t%s", | ||
| 248 | __entry->vm, __entry->pde, __entry->last, __entry->first, | ||
| 249 | __get_str(cur_ptes)) | ||
| 250 | ); | ||
| 251 | |||
| 252 | DEFINE_EVENT(i915_page_table_entry_update, i915_page_table_entry_map, | ||
| 253 | TP_PROTO(struct i915_address_space *vm, u32 pde, | ||
| 254 | struct i915_page_table_entry *pt, u32 first, u32 count, u32 bits), | ||
| 255 | TP_ARGS(vm, pde, pt, first, count, bits) | ||
| 256 | ); | ||
| 257 | |||
| 159 | TRACE_EVENT(i915_gem_object_change_domain, | 258 | TRACE_EVENT(i915_gem_object_change_domain, |
| 160 | TP_PROTO(struct drm_i915_gem_object *obj, u32 old_read, u32 old_write), | 259 | TP_PROTO(struct drm_i915_gem_object *obj, u32 old_read, u32 old_write), |
| 161 | TP_ARGS(obj, old_read, old_write), | 260 | TP_ARGS(obj, old_read, old_write), |
