drm/i915: Separate GEM context construction and registration to userspace
In later patches, it became apparent that userspace can see a partially constructed GEM context and begin using it before it was ready, to much hilarity. Close this window of opportunity by lifting the registration of the context with userspace (the insertion of the context into the filp's idr) to the very end of the CONTEXT_CREATE ioctl. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190321140711.11190-1-chris@chris-wilson.co.uk
This commit is contained in:
@@ -1713,7 +1713,7 @@ int i915_gem_huge_page_mock_selftests(void)
|
||||
mkwrite_device_info(dev_priv)->ppgtt_size = 48;
|
||||
|
||||
mutex_lock(&dev_priv->drm.struct_mutex);
|
||||
ppgtt = i915_ppgtt_create(dev_priv, ERR_PTR(-ENODEV));
|
||||
ppgtt = i915_ppgtt_create(dev_priv);
|
||||
if (IS_ERR(ppgtt)) {
|
||||
err = PTR_ERR(ppgtt);
|
||||
goto out_unlock;
|
||||
|
@@ -76,7 +76,7 @@ static int live_nop_switch(void *arg)
|
||||
}
|
||||
|
||||
for (n = 0; n < nctx; n++) {
|
||||
ctx[n] = i915_gem_create_context(i915, file->driver_priv);
|
||||
ctx[n] = live_context(i915, file);
|
||||
if (IS_ERR(ctx[n])) {
|
||||
err = PTR_ERR(ctx[n]);
|
||||
goto out_unlock;
|
||||
@@ -513,7 +513,7 @@ static int igt_ctx_exec(void *arg)
|
||||
struct i915_gem_context *ctx;
|
||||
unsigned int id;
|
||||
|
||||
ctx = i915_gem_create_context(i915, file->driver_priv);
|
||||
ctx = live_context(i915, file);
|
||||
if (IS_ERR(ctx)) {
|
||||
err = PTR_ERR(ctx);
|
||||
goto out_unlock;
|
||||
@@ -962,7 +962,7 @@ __igt_ctx_sseu(struct drm_i915_private *i915,
|
||||
|
||||
mutex_lock(&i915->drm.struct_mutex);
|
||||
|
||||
ctx = i915_gem_create_context(i915, file->driver_priv);
|
||||
ctx = live_context(i915, file);
|
||||
if (IS_ERR(ctx)) {
|
||||
ret = PTR_ERR(ctx);
|
||||
goto out_unlock;
|
||||
@@ -1072,7 +1072,7 @@ static int igt_ctx_readonly(void *arg)
|
||||
if (err)
|
||||
goto out_unlock;
|
||||
|
||||
ctx = i915_gem_create_context(i915, file->driver_priv);
|
||||
ctx = live_context(i915, file);
|
||||
if (IS_ERR(ctx)) {
|
||||
err = PTR_ERR(ctx);
|
||||
goto out_unlock;
|
||||
@@ -1397,13 +1397,13 @@ static int igt_vm_isolation(void *arg)
|
||||
if (err)
|
||||
goto out_unlock;
|
||||
|
||||
ctx_a = i915_gem_create_context(i915, file->driver_priv);
|
||||
ctx_a = live_context(i915, file);
|
||||
if (IS_ERR(ctx_a)) {
|
||||
err = PTR_ERR(ctx_a);
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
ctx_b = i915_gem_create_context(i915, file->driver_priv);
|
||||
ctx_b = live_context(i915, file);
|
||||
if (IS_ERR(ctx_b)) {
|
||||
err = PTR_ERR(ctx_b);
|
||||
goto out_unlock;
|
||||
|
@@ -1010,7 +1010,7 @@ static int exercise_ppgtt(struct drm_i915_private *dev_priv,
|
||||
return PTR_ERR(file);
|
||||
|
||||
mutex_lock(&dev_priv->drm.struct_mutex);
|
||||
ppgtt = i915_ppgtt_create(dev_priv, file->driver_priv);
|
||||
ppgtt = i915_ppgtt_create(dev_priv);
|
||||
if (IS_ERR(ppgtt)) {
|
||||
err = PTR_ERR(ppgtt);
|
||||
goto out_unlock;
|
||||
|
@@ -88,9 +88,24 @@ void mock_init_contexts(struct drm_i915_private *i915)
|
||||
struct i915_gem_context *
|
||||
live_context(struct drm_i915_private *i915, struct drm_file *file)
|
||||
{
|
||||
struct i915_gem_context *ctx;
|
||||
int err;
|
||||
|
||||
lockdep_assert_held(&i915->drm.struct_mutex);
|
||||
|
||||
return i915_gem_create_context(i915, file->driver_priv);
|
||||
ctx = i915_gem_create_context(i915);
|
||||
if (IS_ERR(ctx))
|
||||
return ctx;
|
||||
|
||||
err = gem_context_register(ctx, file->driver_priv);
|
||||
if (err)
|
||||
goto err_ctx;
|
||||
|
||||
return ctx;
|
||||
|
||||
err_ctx:
|
||||
context_close(ctx);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
struct i915_gem_context *
|
||||
|
Reference in New Issue
Block a user