提交 72ad5c45 编写于 作者: B Ben Widawsky 提交者: Daniel Vetter

drm/i915/ppgtt: Fix ioctl errno for "no such context"

Without this fix the ioctls silently succeeded (but actually did
nothing).

It makes all the code which calls into this function way too confusing.

v2: Fix destroy IOCTL as well

v3: Clarify the other two callers of i915_gem_context_get() to never
check for NULL. (Mika)

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=72903Signed-off-by: NBen Widawsky <ben@bwidawsk.net>
Testcase: igt/gem_ctx_exec/basic
[danvet: Fix up the commit message and actually bother to mention the
testcase this fixes.]
Reviewed-by: NMika Kuoppala <mika.kuoppala@intel.com>
Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
上级 a7c1d426
...@@ -526,10 +526,16 @@ void i915_gem_context_close(struct drm_device *dev, struct drm_file *file) ...@@ -526,10 +526,16 @@ void i915_gem_context_close(struct drm_device *dev, struct drm_file *file)
struct i915_hw_context * struct i915_hw_context *
i915_gem_context_get(struct drm_i915_file_private *file_priv, u32 id) i915_gem_context_get(struct drm_i915_file_private *file_priv, u32 id)
{ {
struct i915_hw_context *ctx;
if (!HAS_HW_CONTEXTS(file_priv->dev_priv->dev)) if (!HAS_HW_CONTEXTS(file_priv->dev_priv->dev))
return file_priv->private_default_ctx; return file_priv->private_default_ctx;
return (struct i915_hw_context *)idr_find(&file_priv->context_idr, id); ctx = (struct i915_hw_context *)idr_find(&file_priv->context_idr, id);
if (!ctx)
return ERR_PTR(-ENOENT);
return ctx;
} }
static inline int static inline int
...@@ -776,9 +782,9 @@ int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data, ...@@ -776,9 +782,9 @@ int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
return ret; return ret;
ctx = i915_gem_context_get(file_priv, args->ctx_id); ctx = i915_gem_context_get(file_priv, args->ctx_id);
if (!ctx) { if (IS_ERR(ctx)) {
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
return -ENOENT; return PTR_ERR(ctx);
} }
idr_remove(&ctx->file_priv->context_idr, ctx->id); idr_remove(&ctx->file_priv->context_idr, ctx->id);
......
...@@ -904,7 +904,7 @@ i915_gem_validate_context(struct drm_device *dev, struct drm_file *file, ...@@ -904,7 +904,7 @@ i915_gem_validate_context(struct drm_device *dev, struct drm_file *file,
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
ctx = i915_gem_context_get(file->driver_priv, ctx_id); ctx = i915_gem_context_get(file->driver_priv, ctx_id);
if (IS_ERR_OR_NULL(ctx)) if (IS_ERR(ctx))
return ctx; return ctx;
hs = &ctx->hang_stats; hs = &ctx->hang_stats;
...@@ -1112,7 +1112,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, ...@@ -1112,7 +1112,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
} }
ctx = i915_gem_validate_context(dev, file, ring, ctx_id); ctx = i915_gem_validate_context(dev, file, ring, ctx_id);
if (IS_ERR_OR_NULL(ctx)) { if (IS_ERR(ctx)) {
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
ret = PTR_ERR(ctx); ret = PTR_ERR(ctx);
goto pre_mutex_err; goto pre_mutex_err;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册