drm/i915: Add a tracepoint for the shrinker
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 1 Oct 2015 11:18:26 +0000 (12:18 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 7 Oct 2015 14:05:38 +0000 (16:05 +0200)
Often it is very useful to know why we suddenly purge vast tracts of
memory and surprisingly up until now we didn't even have a tracepoint
for when we shrink our memory.

Note that there are slab_start/end tracepoints already, but those
don't cover the internal recursion when we directly call into our
shrinker code. Hence a separate tracepoint seems justified. Also note
that we don't really need a separate tracepoint for the actual amount
of pages freed since we already have an unbind tracpoint for that.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
[danvet: Add a note that there's also slab_start/end and why they're
insufficient.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_gem_shrinker.c
drivers/gpu/drm/i915/i915_trace.h

index 858df2bffc9ee7d6bc0a635aa771d79d8b35c4fb..1b66e1d1def115d3f3a7b67fcc6e429b722d3e79 100644 (file)
@@ -85,6 +85,8 @@ i915_gem_shrink(struct drm_i915_private *dev_priv,
        }, *phase;
        unsigned long count = 0;
 
+       trace_i915_gem_shrink(dev_priv, target, flags);
+
        /*
         * As we may completely rewrite the (un)bound list whilst unbinding
         * (due to retiring requests) we have to strictly process only
index d0993bc814ea5beeffa9126780b84ec16b4ba0ba..04fe8491c8b67d104b5b91d1f13df39cff5bb91c 100644 (file)
@@ -107,6 +107,26 @@ TRACE_EVENT(i915_gem_object_create,
            TP_printk("obj=%p, size=%u", __entry->obj, __entry->size)
 );
 
+TRACE_EVENT(i915_gem_shrink,
+           TP_PROTO(struct drm_i915_private *i915, unsigned long target, unsigned flags),
+           TP_ARGS(i915, target, flags),
+
+           TP_STRUCT__entry(
+                            __field(int, dev)
+                            __field(unsigned long, target)
+                            __field(unsigned, flags)
+                            ),
+
+           TP_fast_assign(
+                          __entry->dev = i915->dev->primary->index;
+                          __entry->target = target;
+                          __entry->flags = flags;
+                          ),
+
+           TP_printk("dev=%d, target=%lu, flags=%x",
+                     __entry->dev, __entry->target, __entry->flags)
+);
+
 TRACE_EVENT(i915_vma_bind,
            TP_PROTO(struct i915_vma *vma, unsigned flags),
            TP_ARGS(vma, flags),