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), |