aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMika Kuoppala <mika.kuoppala@linux.intel.com>2016-11-16 17:20:34 +0200
committerMika Kuoppala <mika.kuoppala@intel.com>2016-11-21 14:36:56 +0200
commitbc1d53c64773e89175766e8c77cc96aa0763de4a (patch)
treeb1a5b1838cc1f5ea6c2eea4e56fbb259e56bcfef
parentdrm/i915: Add per client max context ban limit (diff)
downloadlinux-dev-bc1d53c64773e89175766e8c77cc96aa0763de4a.tar.xz
linux-dev-bc1d53c64773e89175766e8c77cc96aa0763de4a.zip
drm/i915: Wipe hang stats as an embedded struct
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
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h31
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c25
-rw-r--r--drivers/gpu/drm/i915/i915_gem_context.c12
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c4
-rw-r--r--drivers/gpu/drm/i915/i915_gem_request.c4
-rw-r--r--drivers/gpu/drm/i915/i915_gpu_error.c2
6 files changed, 29 insertions, 49 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 1f0b5c37f6de..c7d5f7a30fe8 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -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 {
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index a8118386a23b..b38d4f8d1875 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -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 *
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 88d59866c433..f82936a2fcce 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -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);
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 097d9d8c2315..522ecfb4dc9d 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -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);
}
diff --git a/drivers/gpu/drm/i915/i915_gem_request.c b/drivers/gpu/drm/i915/i915_gem_request.c
index 60e63956ea19..9f37eaa3723a 100644
--- a/drivers/gpu/drm/i915/i915_gem_request.c
+++ b/drivers/gpu/drm/i915/i915_gem_request.c
@@ -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);
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
index af4f0ef4fa08..82458ea60150 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.c
+++ b/drivers/gpu/drm/i915/i915_gpu_error.c
@@ -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;