Take a snapshot of the ctx->engines, so we can avoid taking the
ctx->engines_mutex for a mere read in get_engines().

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/gem/i915_gem_context.c | 39 +++++----------------
 1 file changed, 8 insertions(+), 31 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c 
b/drivers/gpu/drm/i915/gem/i915_gem_context.c
index e87da2525d0f..8c5514574e8b 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c
@@ -1839,27 +1839,6 @@ set_engines(struct i915_gem_context *ctx,
        return 0;
 }
 
-static struct i915_gem_engines *
-__copy_engines(struct i915_gem_engines *e)
-{
-       struct i915_gem_engines *copy;
-       unsigned int n;
-
-       copy = alloc_engines(e->num_engines);
-       if (!copy)
-               return ERR_PTR(-ENOMEM);
-
-       for (n = 0; n < e->num_engines; n++) {
-               if (e->engines[n])
-                       copy->engines[n] = intel_context_get(e->engines[n]);
-               else
-                       copy->engines[n] = NULL;
-       }
-       copy->num_engines = n;
-
-       return copy;
-}
-
 static int
 get_engines(struct i915_gem_context *ctx,
            struct drm_i915_gem_context_param *args)
@@ -1867,19 +1846,17 @@ get_engines(struct i915_gem_context *ctx,
        struct i915_context_param_engines __user *user;
        struct i915_gem_engines *e;
        size_t n, count, size;
+       bool user_engines;
        int err = 0;
 
-       err = mutex_lock_interruptible(&ctx->engines_mutex);
-       if (err)
-               return err;
+       e = __context_engines_await(ctx, &user_engines);
+       if (!e)
+               return -ENOENT;
 
-       e = NULL;
-       if (i915_gem_context_user_engines(ctx))
-               e = __copy_engines(i915_gem_context_engines(ctx));
-       mutex_unlock(&ctx->engines_mutex);
-       if (IS_ERR_OR_NULL(e)) {
+       if (!user_engines) {
+               i915_sw_fence_complete(&e->fence);
                args->size = 0;
-               return PTR_ERR_OR_ZERO(e);
+               return 0;
        }
 
        count = e->num_engines;
@@ -1930,7 +1907,7 @@ get_engines(struct i915_gem_context *ctx,
        args->size = size;
 
 err_free:
-       free_engines(e);
+       i915_sw_fence_complete(&e->fence);
        return err;
 }
 
-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to