OSDN Git Service

drm/i915/selftests: Mark up sole accessor to ctx->vm as being protected
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 7 Nov 2019 22:12:01 +0000 (22:12 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 8 Nov 2019 10:52:09 +0000 (10:52 +0000)
In the selftests, where we are accessing a private ctx from within the
confines of a single test, we know that the ctx->vm pointer is static
and bounded by the lifetime of the test. We can use a simple helper to
provide the RCU annotations to keep sparse happy.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191107221201.30497-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c

index 896f47d..9a509c1 100644 (file)
 
 #define DW_PER_PAGE (PAGE_SIZE / sizeof(u32))
 
+static inline struct i915_address_space *ctx_vm(struct i915_gem_context *ctx)
+{
+       /* single threaded, private ctx */
+       return rcu_dereference_protected(ctx->vm, true);
+}
+
 static int live_nop_switch(void *arg)
 {
        const unsigned int nctx = 1024;
@@ -786,14 +792,15 @@ static int igt_shared_ctx_exec(void *arg)
                        }
 
                        mutex_lock(&ctx->mutex);
-                       __assign_ppgtt(ctx, parent->vm);
+                       __assign_ppgtt(ctx, ctx_vm(parent));
                        mutex_unlock(&ctx->mutex);
 
                        ce = i915_gem_context_get_engine(ctx, engine->legacy_idx);
                        GEM_BUG_ON(IS_ERR(ce));
 
                        if (!obj) {
-                               obj = create_test_object(parent->vm, file, &objects);
+                               obj = create_test_object(ctx_vm(parent),
+                                                        file, &objects);
                                if (IS_ERR(obj)) {
                                        err = PTR_ERR(obj);
                                        intel_context_put(ce);
@@ -1343,14 +1350,11 @@ static int igt_ctx_readonly(void *arg)
                goto out_file;
        }
 
-       rcu_read_lock();
-       vm = rcu_dereference(ctx->vm) ?: &i915->ggtt.alias->vm;
+       vm = ctx_vm(ctx) ?: &i915->ggtt.alias->vm;
        if (!vm || !vm->has_read_only) {
-               rcu_read_unlock();
                err = 0;
                goto out_file;
        }
-       rcu_read_unlock();
 
        ndwords = 0;
        dw = 0;
@@ -1380,7 +1384,7 @@ static int igt_ctx_readonly(void *arg)
                                pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) [full-ppgtt? %s], err=%d\n",
                                       ndwords, dw, max_dwords(obj),
                                       ce->engine->name,
-                                      yesno(!!rcu_access_pointer(ctx->vm)),
+                                      yesno(!!ctx_vm(ctx)),
                                       err);
                                i915_gem_context_unlock_engines(ctx);
                                goto out_file;
@@ -1698,11 +1702,11 @@ static int igt_vm_isolation(void *arg)
        }
 
        /* We can only test vm isolation, if the vm are distinct */
-       if (ctx_a->vm == ctx_b->vm)
+       if (ctx_vm(ctx_a) == ctx_vm(ctx_b))
                goto out_file;
 
-       vm_total = ctx_a->vm->total;
-       GEM_BUG_ON(ctx_b->vm->total != vm_total);
+       vm_total = ctx_vm(ctx_a)->total;
+       GEM_BUG_ON(ctx_vm(ctx_b)->total != vm_total);
        vm_total -= I915_GTT_PAGE_SIZE;
 
        count = 0;