]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
drm/i915: add i915_gem_context_get_hang_stats()
authorMika Kuoppala <mika.kuoppala@linux.intel.com>
Wed, 12 Jun 2013 09:35:29 +0000 (12:35 +0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 13 Jun 2013 15:42:15 +0000 (17:42 +0200)
To get context hang statistics for specified context,
add i915_gem_context_get_hang_stats().

For arb-robustness, every context needs to have its own
hang statistics tracking. Added function will return
the user specified context statistics or in case of
default context, statistics from drm_i915_file_private.

v2: handle default context inside get_reset_state

v3: return struct pointer instead of passing it in as param
    (Chris Wilson)

Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Ben Widawsky <ben@bwidawsk.net>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem_context.c

index 124eb1a9e9c3685b34caa9dc71e860c3c64a877f..cfa9286436516822990a676dada5995d4d04b59a 100644 (file)
@@ -1812,6 +1812,10 @@ static inline void i915_gem_context_unreference(struct i915_hw_context *ctx)
        kref_put(&ctx->ref, i915_gem_context_free);
 }
 
+struct i915_ctx_hang_stats * __must_check
+i915_gem_context_get_hang_stats(struct intel_ring_buffer *ring,
+                               struct drm_file *file,
+                               u32 id);
 int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
                                  struct drm_file *file);
 int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
index 39bcc087db96b51304ca550271d073d56ceb33c8..f5ea3c1351f8434ff128e2aec3d67a4d3efd44e3 100644 (file)
@@ -303,6 +303,34 @@ static int context_idr_cleanup(int id, void *p, void *data)
        return 0;
 }
 
+struct i915_ctx_hang_stats *
+i915_gem_context_get_hang_stats(struct intel_ring_buffer *ring,
+                               struct drm_file *file,
+                               u32 id)
+{
+       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct drm_i915_file_private *file_priv = file->driver_priv;
+       struct i915_hw_context *to;
+
+       if (dev_priv->hw_contexts_disabled)
+               return ERR_PTR(-ENOENT);
+
+       if (ring->id != RCS)
+               return ERR_PTR(-EINVAL);
+
+       if (file == NULL)
+               return ERR_PTR(-EINVAL);
+
+       if (id == DEFAULT_CONTEXT_ID)
+               return &file_priv->hang_stats;
+
+       to = i915_gem_context_get(file->driver_priv, id);
+       if (to == NULL)
+               return ERR_PTR(-ENOENT);
+
+       return &to->hang_stats;
+}
+
 void i915_gem_context_close(struct drm_device *dev, struct drm_file *file)
 {
        struct drm_i915_file_private *file_priv = file->driver_priv;