Commit c836eb79 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915/selftests: Always use an active engine while resetting

Currently, we only try to reset a live engine for checking the whitelist
retention across a per-engine reset. For safety, it appears we need to
prime the system with a hanging spinner before performing a full-device
reset. (Figuring out the root cause behind the instability with handling
a reset during a no-op request is a challenge for another test, the
whitelist test has its own purpose.)

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=109626


Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20190213224805.32021-1-chris@chris-wilson.co.uk


Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
parent 9a3b19a1
Loading
Loading
Loading
Loading
+8 −19
Original line number Diff line number Diff line
@@ -237,14 +237,8 @@ switch_to_scratch_context(struct intel_engine_cs *engine,
		return PTR_ERR(ctx);

	rq = ERR_PTR(-ENODEV);
	with_intel_runtime_pm(engine->i915, wakeref) {
		if (spin)
			rq = igt_spinner_create_request(spin,
							ctx, engine,
							MI_NOOP);
		else
			rq = i915_request_alloc(engine, ctx);
	}
	with_intel_runtime_pm(engine->i915, wakeref)
		rq = igt_spinner_create_request(spin, ctx, engine, MI_NOOP);

	kernel_context_close(ctx);

@@ -273,7 +267,6 @@ static int check_whitelist_across_reset(struct intel_engine_cs *engine,
					const char *name)
{
	struct drm_i915_private *i915 = engine->i915;
	bool want_spin = reset == do_engine_reset;
	struct i915_gem_context *ctx;
	struct igt_spinner spin;
	intel_wakeref_t wakeref;
@@ -282,11 +275,9 @@ static int check_whitelist_across_reset(struct intel_engine_cs *engine,
	pr_info("Checking %d whitelisted registers (RING_NONPRIV) [%s]\n",
		engine->whitelist.count, name);

	if (want_spin) {
	err = igt_spinner_init(&spin, i915);
	if (err)
		return err;
	}

	ctx = kernel_context(i915);
	if (IS_ERR(ctx))
@@ -298,17 +289,15 @@ static int check_whitelist_across_reset(struct intel_engine_cs *engine,
		goto out;
	}

	err = switch_to_scratch_context(engine, want_spin ? &spin : NULL);
	err = switch_to_scratch_context(engine, &spin);
	if (err)
		goto out;

	with_intel_runtime_pm(i915, wakeref)
		err = reset(engine);

	if (want_spin) {
	igt_spinner_end(&spin);
	igt_spinner_fini(&spin);
	}

	if (err) {
		pr_err("%s reset failed\n", name);