drm/i915/gem: Silence sparse for RCU protection inside the constructor
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 14 Nov 2019 22:57:36 +0000 (22:57 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 15 Nov 2019 16:43:33 +0000 (16:43 +0000)
Inside the constructor, while cloning, we need to replace the
dst->engines. Having forgotten that dst->engines is marked as RCU
protected, we need to add the appropriate annotations to make sparse
happy.

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/20191114225736.616885-5-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gem/i915_gem_context.c

index 1284f47..6f1e618 100644 (file)
@@ -2009,7 +2009,8 @@ static int clone_engines(struct i915_gem_context *dst,
        user_engines = i915_gem_context_user_engines(src);
        i915_gem_context_unlock_engines(src);
 
-       free_engines(dst->engines);
+       /* Serialised by constructor */
+       free_engines(__context_engines_static(dst));
        RCU_INIT_POINTER(dst->engines, clone);
        if (user_engines)
                i915_gem_context_set_user_engines(dst);
@@ -2044,7 +2045,8 @@ static int clone_sseu(struct i915_gem_context *dst,
        unsigned long n;
        int err;
 
-       clone = dst->engines; /* no locking required; sole access */
+       /* no locking required; sole access under constructor*/
+       clone = __context_engines_static(dst);
        if (e->num_engines != clone->num_engines) {
                err = -EINVAL;
                goto unlock;