[Intel-gfx] [PATCH] drm/i915/selftests: Drop igt_cs_tlb

Das, Nirmoy nirmoy.das at linux.intel.com
Mon Mar 20 17:58:40 UTC 2023


On 2/17/2023 11:33 PM, Jonathan Cavitt wrote:
> The gt_tlb live selftest has the same code coverage as the
> igt_cs_tlb subtest of gtt, except it is better at detecting
> TLB bugs.  Furthermore, while igt_cs_tlb is hitting some
> unforeseen issues, these issues are either false positives
> due to the test being poorly formatted, or are true
> positives that can be more easily diagnosed with smaller
> tests.  As such, igt_cs_tlb is superceded by and obsoleted
> by gt_tlb, meaning it can be removed.
>
> Signed-off-by: Jonathan Cavitt <jonathan.cavitt at intel.com>

Acked-by: Nirmoy Das <nirmoy.das at intel.com>


> ---
>   drivers/gpu/drm/i915/selftests/i915_gem_gtt.c | 356 ------------------
>   1 file changed, 356 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
> index 01e75160a84a..5361ce70d3f2 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
> @@ -1940,361 +1940,6 @@ int i915_gem_gtt_mock_selftests(void)
>   	return err;
>   }
>   
> -static int context_sync(struct intel_context *ce)
> -{
> -	struct i915_request *rq;
> -	long timeout;
> -
> -	rq = intel_context_create_request(ce);
> -	if (IS_ERR(rq))
> -		return PTR_ERR(rq);
> -
> -	i915_request_get(rq);
> -	i915_request_add(rq);
> -
> -	timeout = i915_request_wait(rq, 0, HZ / 5);
> -	i915_request_put(rq);
> -
> -	return timeout < 0 ? -EIO : 0;
> -}
> -
> -static struct i915_request *
> -submit_batch(struct intel_context *ce, u64 addr)
> -{
> -	struct i915_request *rq;
> -	int err;
> -
> -	rq = intel_context_create_request(ce);
> -	if (IS_ERR(rq))
> -		return rq;
> -
> -	err = 0;
> -	if (rq->engine->emit_init_breadcrumb) /* detect a hang */
> -		err = rq->engine->emit_init_breadcrumb(rq);
> -	if (err == 0)
> -		err = rq->engine->emit_bb_start(rq, addr, 0, 0);
> -
> -	if (err == 0)
> -		i915_request_get(rq);
> -	i915_request_add(rq);
> -
> -	return err ? ERR_PTR(err) : rq;
> -}
> -
> -static u32 *spinner(u32 *batch, int i)
> -{
> -	return batch + i * 64 / sizeof(*batch) + 4;
> -}
> -
> -static void end_spin(u32 *batch, int i)
> -{
> -	*spinner(batch, i) = MI_BATCH_BUFFER_END;
> -	wmb();
> -}
> -
> -static int igt_cs_tlb(void *arg)
> -{
> -	const unsigned int count = PAGE_SIZE / 64;
> -	const unsigned int chunk_size = count * PAGE_SIZE;
> -	struct drm_i915_private *i915 = arg;
> -	struct drm_i915_gem_object *bbe, *act, *out;
> -	struct i915_gem_engines_iter it;
> -	struct i915_address_space *vm;
> -	struct i915_gem_context *ctx;
> -	struct intel_context *ce;
> -	struct i915_vma *vma;
> -	I915_RND_STATE(prng);
> -	struct file *file;
> -	unsigned int i;
> -	u32 *result;
> -	u32 *batch;
> -	int err = 0;
> -
> -	/*
> -	 * Our mission here is to fool the hardware to execute something
> -	 * from scratch as it has not seen the batch move (due to missing
> -	 * the TLB invalidate).
> -	 */
> -
> -	file = mock_file(i915);
> -	if (IS_ERR(file))
> -		return PTR_ERR(file);
> -
> -	ctx = live_context(i915, file);
> -	if (IS_ERR(ctx)) {
> -		err = PTR_ERR(ctx);
> -		goto out_unlock;
> -	}
> -
> -	vm = i915_gem_context_get_eb_vm(ctx);
> -	if (i915_is_ggtt(vm))
> -		goto out_vm;
> -
> -	/* Create two pages; dummy we prefill the TLB, and intended */
> -	bbe = i915_gem_object_create_internal(i915, PAGE_SIZE);
> -	if (IS_ERR(bbe)) {
> -		err = PTR_ERR(bbe);
> -		goto out_vm;
> -	}
> -
> -	batch = i915_gem_object_pin_map_unlocked(bbe, I915_MAP_WC);
> -	if (IS_ERR(batch)) {
> -		err = PTR_ERR(batch);
> -		goto out_put_bbe;
> -	}
> -	memset32(batch, MI_BATCH_BUFFER_END, PAGE_SIZE / sizeof(u32));
> -	i915_gem_object_flush_map(bbe);
> -	i915_gem_object_unpin_map(bbe);
> -
> -	act = i915_gem_object_create_internal(i915, PAGE_SIZE);
> -	if (IS_ERR(act)) {
> -		err = PTR_ERR(act);
> -		goto out_put_bbe;
> -	}
> -
> -	/* Track the execution of each request by writing into different slot */
> -	batch = i915_gem_object_pin_map_unlocked(act, I915_MAP_WC);
> -	if (IS_ERR(batch)) {
> -		err = PTR_ERR(batch);
> -		goto out_put_act;
> -	}
> -	for (i = 0; i < count; i++) {
> -		u32 *cs = batch + i * 64 / sizeof(*cs);
> -		u64 addr = (vm->total - PAGE_SIZE) + i * sizeof(u32);
> -
> -		GEM_BUG_ON(GRAPHICS_VER(i915) < 6);
> -		cs[0] = MI_STORE_DWORD_IMM_GEN4;
> -		if (GRAPHICS_VER(i915) >= 8) {
> -			cs[1] = lower_32_bits(addr);
> -			cs[2] = upper_32_bits(addr);
> -			cs[3] = i;
> -			cs[4] = MI_NOOP;
> -			cs[5] = MI_BATCH_BUFFER_START_GEN8;
> -		} else {
> -			cs[1] = 0;
> -			cs[2] = lower_32_bits(addr);
> -			cs[3] = i;
> -			cs[4] = MI_NOOP;
> -			cs[5] = MI_BATCH_BUFFER_START;
> -		}
> -	}
> -
> -	out = i915_gem_object_create_internal(i915, PAGE_SIZE);
> -	if (IS_ERR(out)) {
> -		err = PTR_ERR(out);
> -		goto out_put_batch;
> -	}
> -	i915_gem_object_set_cache_coherency(out, I915_CACHING_CACHED);
> -
> -	vma = i915_vma_instance(out, vm, NULL);
> -	if (IS_ERR(vma)) {
> -		err = PTR_ERR(vma);
> -		goto out_put_out;
> -	}
> -
> -	err = i915_vma_pin(vma, 0, 0,
> -			   PIN_USER |
> -			   PIN_OFFSET_FIXED |
> -			   (vm->total - PAGE_SIZE));
> -	if (err)
> -		goto out_put_out;
> -	GEM_BUG_ON(vma->node.start != vm->total - PAGE_SIZE);
> -
> -	result = i915_gem_object_pin_map_unlocked(out, I915_MAP_WB);
> -	if (IS_ERR(result)) {
> -		err = PTR_ERR(result);
> -		goto out_put_out;
> -	}
> -
> -	for_each_gem_engine(ce, i915_gem_context_lock_engines(ctx), it) {
> -		IGT_TIMEOUT(end_time);
> -		unsigned long pass = 0;
> -
> -		if (!intel_engine_can_store_dword(ce->engine))
> -			continue;
> -
> -		while (!__igt_timeout(end_time, NULL)) {
> -			struct i915_vm_pt_stash stash = {};
> -			struct i915_request *rq;
> -			struct i915_gem_ww_ctx ww;
> -			struct i915_vma_resource *vma_res;
> -			u64 offset;
> -
> -			offset = igt_random_offset(&prng,
> -						   0, vm->total - PAGE_SIZE,
> -						   chunk_size, PAGE_SIZE);
> -
> -			memset32(result, STACK_MAGIC, PAGE_SIZE / sizeof(u32));
> -
> -			vma = i915_vma_instance(bbe, vm, NULL);
> -			if (IS_ERR(vma)) {
> -				err = PTR_ERR(vma);
> -				goto end;
> -			}
> -
> -			i915_gem_object_lock(bbe, NULL);
> -			err = i915_vma_get_pages(vma);
> -			i915_gem_object_unlock(bbe);
> -			if (err)
> -				goto end;
> -
> -			vma_res = i915_vma_resource_alloc();
> -			if (IS_ERR(vma_res)) {
> -				i915_vma_put_pages(vma);
> -				err = PTR_ERR(vma_res);
> -				goto end;
> -			}
> -
> -			i915_gem_ww_ctx_init(&ww, false);
> -retry:
> -			err = i915_vm_lock_objects(vm, &ww);
> -			if (err)
> -				goto end_ww;
> -
> -			err = i915_vm_alloc_pt_stash(vm, &stash, chunk_size);
> -			if (err)
> -				goto end_ww;
> -
> -			err = i915_vm_map_pt_stash(vm, &stash);
> -			if (!err)
> -				vm->allocate_va_range(vm, &stash, offset, chunk_size);
> -			i915_vm_free_pt_stash(vm, &stash);
> -end_ww:
> -			if (err == -EDEADLK) {
> -				err = i915_gem_ww_ctx_backoff(&ww);
> -				if (!err)
> -					goto retry;
> -			}
> -			i915_gem_ww_ctx_fini(&ww);
> -			if (err) {
> -				kfree(vma_res);
> -				goto end;
> -			}
> -
> -			i915_vma_resource_init_from_vma(vma_res, vma);
> -			/* Prime the TLB with the dummy pages */
> -			for (i = 0; i < count; i++) {
> -				vma_res->start = offset + i * PAGE_SIZE;
> -				vm->insert_entries(vm, vma_res, I915_CACHE_NONE,
> -						   0);
> -
> -				rq = submit_batch(ce, vma_res->start);
> -				if (IS_ERR(rq)) {
> -					err = PTR_ERR(rq);
> -					i915_vma_resource_fini(vma_res);
> -					kfree(vma_res);
> -					goto end;
> -				}
> -				i915_request_put(rq);
> -			}
> -			i915_vma_resource_fini(vma_res);
> -			i915_vma_put_pages(vma);
> -
> -			err = context_sync(ce);
> -			if (err) {
> -				pr_err("%s: dummy setup timed out\n",
> -				       ce->engine->name);
> -				kfree(vma_res);
> -				goto end;
> -			}
> -
> -			vma = i915_vma_instance(act, vm, NULL);
> -			if (IS_ERR(vma)) {
> -				kfree(vma_res);
> -				err = PTR_ERR(vma);
> -				goto end;
> -			}
> -
> -			i915_gem_object_lock(act, NULL);
> -			err = i915_vma_get_pages(vma);
> -			i915_gem_object_unlock(act);
> -			if (err) {
> -				kfree(vma_res);
> -				goto end;
> -			}
> -
> -			i915_vma_resource_init_from_vma(vma_res, vma);
> -			/* Replace the TLB with target batches */
> -			for (i = 0; i < count; i++) {
> -				struct i915_request *rq;
> -				u32 *cs = batch + i * 64 / sizeof(*cs);
> -				u64 addr;
> -
> -				vma_res->start = offset + i * PAGE_SIZE;
> -				vm->insert_entries(vm, vma_res, I915_CACHE_NONE, 0);
> -
> -				addr = vma_res->start + i * 64;
> -				cs[4] = MI_NOOP;
> -				cs[6] = lower_32_bits(addr);
> -				cs[7] = upper_32_bits(addr);
> -				wmb();
> -
> -				rq = submit_batch(ce, addr);
> -				if (IS_ERR(rq)) {
> -					err = PTR_ERR(rq);
> -					i915_vma_resource_fini(vma_res);
> -					kfree(vma_res);
> -					goto end;
> -				}
> -
> -				/* Wait until the context chain has started */
> -				if (i == 0) {
> -					while (READ_ONCE(result[i]) &&
> -					       !i915_request_completed(rq))
> -						cond_resched();
> -				} else {
> -					end_spin(batch, i - 1);
> -				}
> -
> -				i915_request_put(rq);
> -			}
> -			end_spin(batch, count - 1);
> -
> -			i915_vma_resource_fini(vma_res);
> -			kfree(vma_res);
> -			i915_vma_put_pages(vma);
> -
> -			err = context_sync(ce);
> -			if (err) {
> -				pr_err("%s: writes timed out\n",
> -				       ce->engine->name);
> -				goto end;
> -			}
> -
> -			for (i = 0; i < count; i++) {
> -				if (result[i] != i) {
> -					pr_err("%s: Write lost on pass %lu, at offset %llx, index %d, found %x, expected %x\n",
> -					       ce->engine->name, pass,
> -					       offset, i, result[i], i);
> -					err = -EINVAL;
> -					goto end;
> -				}
> -			}
> -
> -			vm->clear_range(vm, offset, chunk_size);
> -			pass++;
> -		}
> -	}
> -end:
> -	if (igt_flush_test(i915))
> -		err = -EIO;
> -	i915_gem_context_unlock_engines(ctx);
> -	i915_gem_object_unpin_map(out);
> -out_put_out:
> -	i915_gem_object_put(out);
> -out_put_batch:
> -	i915_gem_object_unpin_map(act);
> -out_put_act:
> -	i915_gem_object_put(act);
> -out_put_bbe:
> -	i915_gem_object_put(bbe);
> -out_vm:
> -	i915_vm_put(vm);
> -out_unlock:
> -	fput(file);
> -	return err;
> -}
> -
>   int i915_gem_gtt_live_selftests(struct drm_i915_private *i915)
>   {
>   	static const struct i915_subtest tests[] = {
> @@ -2314,7 +1959,6 @@ int i915_gem_gtt_live_selftests(struct drm_i915_private *i915)
>   		SUBTEST(igt_ggtt_fill),
>   		SUBTEST(igt_ggtt_page),
>   		SUBTEST(igt_ggtt_misaligned_pin),
> -		SUBTEST(igt_cs_tlb),
>   	};
>   
>   	GEM_BUG_ON(offset_in_page(to_gt(i915)->ggtt->vm.total));


More information about the Intel-gfx mailing list