提交 984ff29f 编写于 作者: C Chris Wilson

drm/i915: Simplify testing for am-I-the-kernel-context?

The kernel context (dev_priv->kernel_context) is unique in that it is
not associated with any user filp - it is the only one with
ctx->file_priv == NULL. This is a simpler test than comparing it against
dev_priv->kernel_context which involves some pointer dancing.

In checking that this is true, we notice that the gvt context is
allocating itself a i915_hw_ppgtt it doesn't use and not flagging that
its file_priv should be invalid.
Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170106152013.24684-5-chris@chris-wilson.co.uk
上级 e8f9ae9b
...@@ -4230,7 +4230,7 @@ static void assert_kernel_context_is_current(struct drm_i915_private *dev_priv) ...@@ -4230,7 +4230,7 @@ static void assert_kernel_context_is_current(struct drm_i915_private *dev_priv)
enum intel_engine_id id; enum intel_engine_id id;
for_each_engine(engine, dev_priv, id) for_each_engine(engine, dev_priv, id)
GEM_BUG_ON(engine->last_retired_context != dev_priv->kernel_context); GEM_BUG_ON(!i915_gem_context_is_kernel(engine->last_retired_context));
} }
int i915_gem_suspend(struct drm_i915_private *dev_priv) int i915_gem_suspend(struct drm_i915_private *dev_priv)
......
...@@ -413,14 +413,17 @@ i915_gem_context_create_gvt(struct drm_device *dev) ...@@ -413,14 +413,17 @@ i915_gem_context_create_gvt(struct drm_device *dev)
if (ret) if (ret)
return ERR_PTR(ret); return ERR_PTR(ret);
ctx = i915_gem_create_context(to_i915(dev), NULL); ctx = __create_hw_context(to_i915(dev), NULL);
if (IS_ERR(ctx)) if (IS_ERR(ctx))
goto out; goto out;
ctx->file_priv = ERR_PTR(-EBADF);
i915_gem_context_set_closed(ctx); /* not user accessible */ i915_gem_context_set_closed(ctx); /* not user accessible */
i915_gem_context_clear_bannable(ctx); i915_gem_context_clear_bannable(ctx);
i915_gem_context_set_force_single_submission(ctx); i915_gem_context_set_force_single_submission(ctx);
ctx->ring_size = 512 * PAGE_SIZE; /* Max ring buffer size */ ctx->ring_size = 512 * PAGE_SIZE; /* Max ring buffer size */
GEM_BUG_ON(i915_gem_context_is_kernel(ctx));
out: out:
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
return ctx; return ctx;
...@@ -472,6 +475,8 @@ int i915_gem_context_init(struct drm_i915_private *dev_priv) ...@@ -472,6 +475,8 @@ int i915_gem_context_init(struct drm_i915_private *dev_priv)
ctx->priority = I915_PRIORITY_MIN; /* lowest priority; idle task */ ctx->priority = I915_PRIORITY_MIN; /* lowest priority; idle task */
dev_priv->kernel_context = ctx; dev_priv->kernel_context = ctx;
GEM_BUG_ON(!i915_gem_context_is_kernel(ctx));
DRM_DEBUG_DRIVER("%s context support initialized\n", DRM_DEBUG_DRIVER("%s context support initialized\n",
i915.enable_execlists ? "LR" : i915.enable_execlists ? "LR" :
dev_priv->hw_context_size ? "HW" : "fake"); dev_priv->hw_context_size ? "HW" : "fake");
...@@ -524,6 +529,8 @@ void i915_gem_context_fini(struct drm_i915_private *dev_priv) ...@@ -524,6 +529,8 @@ void i915_gem_context_fini(struct drm_i915_private *dev_priv)
lockdep_assert_held(&dev_priv->drm.struct_mutex); lockdep_assert_held(&dev_priv->drm.struct_mutex);
GEM_BUG_ON(!i915_gem_context_is_kernel(dctx));
context_close(dctx); context_close(dctx);
dev_priv->kernel_context = NULL; dev_priv->kernel_context = NULL;
...@@ -549,6 +556,8 @@ int i915_gem_context_open(struct drm_device *dev, struct drm_file *file) ...@@ -549,6 +556,8 @@ int i915_gem_context_open(struct drm_device *dev, struct drm_file *file)
ctx = i915_gem_create_context(to_i915(dev), file_priv); ctx = i915_gem_create_context(to_i915(dev), file_priv);
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
GEM_BUG_ON(i915_gem_context_is_kernel(ctx));
if (IS_ERR(ctx)) { if (IS_ERR(ctx)) {
idr_destroy(&file_priv->context_idr); idr_destroy(&file_priv->context_idr);
return PTR_ERR(ctx); return PTR_ERR(ctx);
...@@ -968,6 +977,8 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, void *data, ...@@ -968,6 +977,8 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
if (IS_ERR(ctx)) if (IS_ERR(ctx))
return PTR_ERR(ctx); return PTR_ERR(ctx);
GEM_BUG_ON(i915_gem_context_is_kernel(ctx));
args->ctx_id = ctx->user_handle; args->ctx_id = ctx->user_handle;
DRM_DEBUG("HW context %d created\n", args->ctx_id); DRM_DEBUG("HW context %d created\n", args->ctx_id);
......
...@@ -246,6 +246,11 @@ static inline bool i915_gem_context_is_default(const struct i915_gem_context *c) ...@@ -246,6 +246,11 @@ static inline bool i915_gem_context_is_default(const struct i915_gem_context *c)
return c->user_handle == DEFAULT_CONTEXT_HANDLE; return c->user_handle == DEFAULT_CONTEXT_HANDLE;
} }
static inline bool i915_gem_context_is_kernel(struct i915_gem_context *ctx)
{
return !ctx->file_priv;
}
/* i915_gem_context.c */ /* i915_gem_context.c */
int __must_check i915_gem_context_init(struct drm_i915_private *dev_priv); int __must_check i915_gem_context_init(struct drm_i915_private *dev_priv);
void i915_gem_context_lost(struct drm_i915_private *dev_priv); void i915_gem_context_lost(struct drm_i915_private *dev_priv);
......
...@@ -786,7 +786,7 @@ static int execlists_context_pin(struct intel_engine_cs *engine, ...@@ -786,7 +786,7 @@ static int execlists_context_pin(struct intel_engine_cs *engine,
flags = PIN_GLOBAL; flags = PIN_GLOBAL;
if (ctx->ggtt_offset_bias) if (ctx->ggtt_offset_bias)
flags |= PIN_OFFSET_BIAS | ctx->ggtt_offset_bias; flags |= PIN_OFFSET_BIAS | ctx->ggtt_offset_bias;
if (ctx == ctx->i915->kernel_context) if (i915_gem_context_is_kernel(ctx))
flags |= PIN_HIGH; flags |= PIN_HIGH;
ret = i915_vma_pin(ce->state, 0, GEN8_LR_CONTEXT_ALIGN, flags); ret = i915_vma_pin(ce->state, 0, GEN8_LR_CONTEXT_ALIGN, flags);
......
...@@ -1974,7 +1974,7 @@ static int intel_ring_context_pin(struct intel_engine_cs *engine, ...@@ -1974,7 +1974,7 @@ static int intel_ring_context_pin(struct intel_engine_cs *engine,
unsigned int flags; unsigned int flags;
flags = 0; flags = 0;
if (ctx == ctx->i915->kernel_context) if (i915_gem_context_is_kernel(ctx))
flags = PIN_HIGH; flags = PIN_HIGH;
ret = context_pin(ctx, flags); ret = context_pin(ctx, flags);
...@@ -1989,7 +1989,7 @@ static int intel_ring_context_pin(struct intel_engine_cs *engine, ...@@ -1989,7 +1989,7 @@ static int intel_ring_context_pin(struct intel_engine_cs *engine,
* as during eviction we cannot allocate and pin the renderstate in * as during eviction we cannot allocate and pin the renderstate in
* order to initialise the context. * order to initialise the context.
*/ */
if (ctx == ctx->i915->kernel_context) if (i915_gem_context_is_kernel(ctx))
ce->initialised = true; ce->initialised = true;
i915_gem_context_get(ctx); i915_gem_context_get(ctx);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册