drm/i915: Wipe hang stats as an embedded struct
authorMika Kuoppala <mika.kuoppala@linux.intel.com>
Wed, 16 Nov 2016 15:20:34 +0000 (17:20 +0200)
committerMika Kuoppala <mika.kuoppala@intel.com>
Mon, 21 Nov 2016 12:36:56 +0000 (14:36 +0200)
Bannable property, banned status, guilty and active counts are
properties of i915_gem_context. Make them so.

v2: rebase

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1479309634-28574-1-git-send-email-mika.kuoppala@intel.com
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem_context.c
drivers/gpu/drm/i915/i915_gem_execbuffer.c
drivers/gpu/drm/i915/i915_gem_request.c
drivers/gpu/drm/i915/i915_gpu_error.c

index 1f0b5c37f6de493356b5f248b06a0ea9a9d3fac3..c7d5f7a30fe80dda57de2d06b9a91629b5057761 100644 (file)
@@ -913,25 +913,6 @@ enum i915_cache_level {
        I915_CACHE_WT, /* hsw:gt3e WriteThrough for scanouts */
 };
 
-struct i915_ctx_hang_stats {
-       /* This context had batch pending when hang was declared */
-       unsigned batch_pending;
-
-       /* This context had batch active when hang was declared */
-       unsigned batch_active;
-
-       bool bannable:1;
-
-       /* This context is banned to submit more work */
-       bool banned:1;
-
-#define CONTEXT_SCORE_GUILTY           10
-#define CONTEXT_SCORE_BAN_THRESHOLD    40
-       /* Accumulated score of hangs caused by this context */
-       int ban_score;
-};
-
-/* This must match up with the value previously used for execbuf2.rsvd1. */
 #define DEFAULT_CONTEXT_HANDLE 0
 
 /**
@@ -961,8 +942,6 @@ struct i915_gem_context {
        struct pid *pid;
        const char *name;
 
-       struct i915_ctx_hang_stats hang_stats;
-
        unsigned long flags;
 #define CONTEXT_NO_ZEROMAP             BIT(0)
 #define CONTEXT_NO_ERROR_CAPTURE       BIT(1)
@@ -991,6 +970,16 @@ struct i915_gem_context {
 
        u8 remap_slice;
        bool closed:1;
+       bool bannable:1;
+       bool banned:1;
+
+       unsigned int guilty_count; /* guilty of a hang */
+       unsigned int active_count; /* active during hang */
+
+#define CONTEXT_SCORE_GUILTY           10
+#define CONTEXT_SCORE_BAN_THRESHOLD    40
+       /* Accumulated score of hangs caused by this context */
+       int ban_score;
 };
 
 enum fb_op_origin {
index a8118386a23b9dc081f3610e1994cff4ee214ec0..b38d4f8d187558e32165358cb55d62caef6b438f 100644 (file)
@@ -2622,15 +2622,13 @@ err_unlock:
 
 static bool i915_context_is_banned(const struct i915_gem_context *ctx)
 {
-       const struct i915_ctx_hang_stats *hs = &ctx->hang_stats;
-
-       if (hs->banned)
+       if (ctx->banned)
                return true;
 
-       if (!hs->bannable)
+       if (!ctx->bannable)
                return false;
 
-       if (hs->ban_score >= CONTEXT_SCORE_BAN_THRESHOLD) {
+       if (ctx->ban_score >= CONTEXT_SCORE_BAN_THRESHOLD) {
                DRM_DEBUG("context hanging too often, banning!\n");
                return true;
        }
@@ -2640,20 +2638,19 @@ static bool i915_context_is_banned(const struct i915_gem_context *ctx)
 
 static void i915_gem_context_mark_guilty(struct i915_gem_context *ctx)
 {
-       struct i915_ctx_hang_stats *hs = &ctx->hang_stats;
-
-       hs->ban_score += CONTEXT_SCORE_GUILTY;
+       ctx->ban_score += CONTEXT_SCORE_GUILTY;
 
-       hs->banned = i915_context_is_banned(ctx);
-       hs->batch_active++;
+       ctx->banned = i915_context_is_banned(ctx);
+       ctx->guilty_count++;
 
        DRM_DEBUG_DRIVER("context %s marked guilty (score %d) banned? %s\n",
-                        ctx->name, hs->ban_score, yesno(hs->banned));
+                        ctx->name, ctx->ban_score,
+                        yesno(ctx->banned));
 
        if (!ctx->file_priv)
                return;
 
-       if (hs->banned) {
+       if (ctx->banned) {
                ctx->file_priv->context_bans++;
 
                DRM_DEBUG_DRIVER("client %s has has %d context banned\n",
@@ -2664,9 +2661,7 @@ static void i915_gem_context_mark_guilty(struct i915_gem_context *ctx)
 
 static void i915_gem_context_mark_innocent(struct i915_gem_context *ctx)
 {
-       struct i915_ctx_hang_stats *hs = &ctx->hang_stats;
-
-       hs->batch_pending++;
+       ctx->active_count++;
 }
 
 struct drm_i915_gem_request *
index 88d59866c4339ea2e726ec3416d3d69282c8dce7..f82936a2fccec4f5e0ff7a2df64c2b44d3c064de 100644 (file)
@@ -331,7 +331,7 @@ __create_hw_context(struct drm_device *dev,
         * is no remap info, it will be a NOP. */
        ctx->remap_slice = ALL_L3_SLICES(dev_priv);
 
-       ctx->hang_stats.bannable = true;
+       ctx->bannable = true;
        ctx->ring_size = 4 * PAGE_SIZE;
        ctx->desc_template = GEN8_CTX_ADDRESSING_MODE(dev_priv) <<
                             GEN8_CTX_ADDRESSING_MODE_SHIFT;
@@ -1115,7 +1115,7 @@ int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
                args->value = !!(ctx->flags & CONTEXT_NO_ERROR_CAPTURE);
                break;
        case I915_CONTEXT_PARAM_BANNABLE:
-               args->value = ctx->hang_stats.bannable;
+               args->value = ctx->bannable;
                break;
        default:
                ret = -EINVAL;
@@ -1172,7 +1172,7 @@ int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data,
                else if (!capable(CAP_SYS_ADMIN) && !args->value)
                        ret = -EPERM;
                else
-                       ctx->hang_stats.bannable = args->value;
+                       ctx->bannable = args->value;
                break;
        default:
                ret = -EINVAL;
@@ -1188,7 +1188,6 @@ int i915_gem_context_reset_stats_ioctl(struct drm_device *dev,
 {
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct drm_i915_reset_stats *args = data;
-       struct i915_ctx_hang_stats *hs;
        struct i915_gem_context *ctx;
        int ret;
 
@@ -1207,15 +1206,14 @@ int i915_gem_context_reset_stats_ioctl(struct drm_device *dev,
                mutex_unlock(&dev->struct_mutex);
                return PTR_ERR(ctx);
        }
-       hs = &ctx->hang_stats;
 
        if (capable(CAP_SYS_ADMIN))
                args->reset_count = i915_reset_count(&dev_priv->gpu_error);
        else
                args->reset_count = 0;
 
-       args->batch_active = hs->batch_active;
-       args->batch_pending = hs->batch_pending;
+       args->batch_active = ctx->guilty_count;
+       args->batch_pending = ctx->active_count;
 
        mutex_unlock(&dev->struct_mutex);
 
index 097d9d8c2315e061a3600615532c6d51531ee42c..522ecfb4dc9d8e557e45dc8bf290e7a5dec20b93 100644 (file)
@@ -1232,14 +1232,12 @@ i915_gem_validate_context(struct drm_device *dev, struct drm_file *file,
                          struct intel_engine_cs *engine, const u32 ctx_id)
 {
        struct i915_gem_context *ctx;
-       struct i915_ctx_hang_stats *hs;
 
        ctx = i915_gem_context_lookup(file->driver_priv, ctx_id);
        if (IS_ERR(ctx))
                return ctx;
 
-       hs = &ctx->hang_stats;
-       if (hs->banned) {
+       if (ctx->banned) {
                DRM_DEBUG("Context %u tried to submit while banned\n", ctx_id);
                return ERR_PTR(-EIO);
        }
index 60e63956ea1949368ccd193e869a576415caabc3..9f37eaa3723a4741dc7bc23722629e3def039a6d 100644 (file)
@@ -264,8 +264,8 @@ static void i915_gem_request_retire(struct drm_i915_gem_request *request)
        }
 
        /* Retirement decays the ban score as it is a sign of ctx progress */
-       if (request->ctx->hang_stats.ban_score > 0)
-               request->ctx->hang_stats.ban_score--;
+       if (request->ctx->ban_score > 0)
+               request->ctx->ban_score--;
 
        i915_gem_context_put(request->ctx);
 
index af4f0ef4fa08fa7d32602e2b9e5b65d4c70bc303..82458ea60150ace76d03fc84e8a12612267af0c9 100644 (file)
@@ -1172,7 +1172,7 @@ static void record_request(struct drm_i915_gem_request *request,
                           struct drm_i915_error_request *erq)
 {
        erq->context = request->ctx->hw_id;
-       erq->ban_score = request->ctx->hang_stats.ban_score;
+       erq->ban_score = request->ctx->ban_score;
        erq->seqno = request->global_seqno;
        erq->jiffies = request->emitted_jiffies;
        erq->head = request->head;