]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915: Stop manually RCU banging in reset_stats_ioctl (v2)
authorJason Ekstrand <jason@jlekstrand.net>
Thu, 8 Jul 2021 15:48:18 +0000 (10:48 -0500)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 8 Jul 2021 17:46:31 +0000 (19:46 +0200)
As far as I can tell, the only real reason for this is to avoid taking a
reference to the i915_gem_context.  The cost of those two atomics
probably pales in comparison to the cost of the ioctl itself so we're
really not buying ourselves anything here.  We're about to make context
lookup a tiny bit more complicated, so let's get rid of the one hand-
rolled case.

Some usermode drivers such as our Vulkan driver call GET_RESET_STATS on
every execbuf so the perf here could theoretically be an issue.  If this
ever does become a performance issue for any such userspace drivers,
they can use set CONTEXT_PARAM_RECOVERABLE to false and look for -EIO
coming from execbuf to check for hangs instead.

v2 (Daniel Vetter):
 - Add a comment in the commit message about recoverable contexts

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20210708154835.528166-14-jason@jlekstrand.net
drivers/gpu/drm/i915/gem/i915_gem_context.c
drivers/gpu/drm/i915/i915_drv.h

index 0ba8506fb966f8fc237bdc572bf4a6ec6a80d25b..61fe6d18d4068602e64558b2ba5427e64ed058ef 100644 (file)
@@ -2090,16 +2090,13 @@ int i915_gem_context_reset_stats_ioctl(struct drm_device *dev,
        struct drm_i915_private *i915 = to_i915(dev);
        struct drm_i915_reset_stats *args = data;
        struct i915_gem_context *ctx;
-       int ret;
 
        if (args->flags || args->pad)
                return -EINVAL;
 
-       ret = -ENOENT;
-       rcu_read_lock();
-       ctx = __i915_gem_context_lookup_rcu(file->driver_priv, args->ctx_id);
+       ctx = i915_gem_context_lookup(file->driver_priv, args->ctx_id);
        if (!ctx)
-               goto out;
+               return -ENOENT;
 
        /*
         * We opt for unserialised reads here. This may result in tearing
@@ -2116,10 +2113,8 @@ int i915_gem_context_reset_stats_ioctl(struct drm_device *dev,
        args->batch_active = atomic_read(&ctx->guilty_count);
        args->batch_pending = atomic_read(&ctx->active_count);
 
-       ret = 0;
-out:
-       rcu_read_unlock();
-       return ret;
+       i915_gem_context_put(ctx);
+       return 0;
 }
 
 /* GEM context-engines iterator: for_each_gem_engine() */
index bfbfbae575737b44cfa96aaf15d3d2dfdd2b03ee..91a15100602d82da43ce33881d7d0ecba29ac72b 100644 (file)
@@ -1847,19 +1847,13 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
 
 struct dma_buf *i915_gem_prime_export(struct drm_gem_object *gem_obj, int flags);
 
-static inline struct i915_gem_context *
-__i915_gem_context_lookup_rcu(struct drm_i915_file_private *file_priv, u32 id)
-{
-       return xa_load(&file_priv->context_xa, id);
-}
-
 static inline struct i915_gem_context *
 i915_gem_context_lookup(struct drm_i915_file_private *file_priv, u32 id)
 {
        struct i915_gem_context *ctx;
 
        rcu_read_lock();
-       ctx = __i915_gem_context_lookup_rcu(file_priv, id);
+       ctx = xa_load(&file_priv->context_xa, id);
        if (ctx && !kref_get_unless_zero(&ctx->ref))
                ctx = NULL;
        rcu_read_unlock();