[Intel-gfx] [PATCH 4/7] drm/i915/selftests: Add tests for GT and engine workaround verification
Chris Wilson
chris at chris-wilson.co.uk
Fri Nov 30 21:04:46 UTC 2018
Quoting Tvrtko Ursulin (2018-11-30 17:44:09)
> From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>
> Two simple selftests which test that both GT and engine workarounds are
> not lost after either a full GPU reset, or after the per-engine ones.
>
> (Including checks that one engine reset is not affecting workarounds not
> belonging to itself.)
>
> v2:
> * Rebase for series refactoring.
> * Add spinner for actual engine reset!
> * Add idle reset test as well. (Chris Wilson)
> * Share existing global_reset_lock. (Chris Wilson)
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
> drivers/gpu/drm/i915/Makefile | 1 +
> drivers/gpu/drm/i915/intel_workarounds.c | 6 +
> drivers/gpu/drm/i915/selftests/igt_common.c | 44 ++++++
> drivers/gpu/drm/i915/selftests/igt_common.h | 15 ++
> .../gpu/drm/i915/selftests/intel_hangcheck.c | 51 ++----
> .../drm/i915/selftests/intel_workarounds.c | 147 +++++++++++++++++-
> 6 files changed, 217 insertions(+), 47 deletions(-)
> create mode 100644 drivers/gpu/drm/i915/selftests/igt_common.c
> create mode 100644 drivers/gpu/drm/i915/selftests/igt_common.h
>
> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
> index 50a8fa8fce64..ceeb21f8aa0c 100644
> --- a/drivers/gpu/drm/i915/Makefile
> +++ b/drivers/gpu/drm/i915/Makefile
> @@ -166,6 +166,7 @@ i915-$(CONFIG_DRM_I915_SELFTEST) += \
> selftests/i915_random.o \
> selftests/i915_selftest.o \
> selftests/igt_flush_test.o \
> + selftests/igt_common.o \
I was anticipating igt_reset.c.
> diff --git a/drivers/gpu/drm/i915/selftests/intel_workarounds.c b/drivers/gpu/drm/i915/selftests/intel_workarounds.c
> index 80396b3592f5..194a3c30554d 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_workarounds.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_workarounds.c
> @@ -6,6 +6,8 @@
>
> #include "../i915_selftest.h"
>
> +#include "igt_common.h"
> +#include "igt_flush_test.h"
> #include "igt_spinner.h"
> #include "igt_wedge_me.h"
> #include "mock_context.h"
> @@ -290,7 +292,6 @@ static int live_reset_whitelist(void *arg)
> {
> struct drm_i915_private *i915 = arg;
> struct intel_engine_cs *engine = i915->engine[RCS];
> - struct i915_gpu_error *error = &i915->gpu_error;
> struct whitelist w;
> int err = 0;
>
> @@ -302,8 +303,7 @@ static int live_reset_whitelist(void *arg)
> if (!whitelist_build(engine, &w))
> return 0;
>
> - set_bit(I915_RESET_BACKOFF, &error->flags);
> - set_bit(I915_RESET_ENGINE + engine->id, &error->flags);
> + igt_global_reset_lock(i915);
>
> if (intel_has_reset_engine(i915)) {
> err = check_whitelist_across_reset(engine,
> @@ -322,15 +322,152 @@ static int live_reset_whitelist(void *arg)
> }
>
> out:
> - clear_bit(I915_RESET_ENGINE + engine->id, &error->flags);
> - clear_bit(I915_RESET_BACKOFF, &error->flags);
> + igt_global_reset_unlock(i915);
Yup, makes sense.
> return err;
> }
>
> +bool intel_engine_workarounds_verify(struct intel_engine_cs *engine,
> + const char *from);
> +
> +static bool verify_gt_engine_wa(struct drm_i915_private *i915, const char *str)
> +{
> + struct intel_engine_cs *engine;
> + enum intel_engine_id id;
> + bool ok = true;
> +
> + ok &= intel_gt_workarounds_verify(i915, str);
> +
> + for_each_engine(engine, i915, id)
> + ok &= intel_engine_workarounds_verify(engine, str);
> +
> + return ok;
> +}
> +
> +static int
> +live_gpu_reset_gt_engine_workarounds(void *arg)
> +{
> + struct drm_i915_private *i915 = arg;
> + struct i915_gpu_error *error = &i915->gpu_error;
> + bool ok;
> +
> + if (!intel_has_gpu_reset(i915))
> + return 0;
> +
> + pr_info("Verifying after GPU reset...\n");
Such noise! ;)
> +
> + igt_global_reset_lock(i915);
> +
> + ok = verify_gt_engine_wa(i915, "before reset");
> + if (!ok)
> + goto out;
> +
> + intel_runtime_pm_get(i915);
> + set_bit(I915_RESET_HANDOFF, &error->flags);
> + i915_reset(i915, ALL_ENGINES, "live_workarounds");
> + intel_runtime_pm_put(i915);
> +
> + ok = verify_gt_engine_wa(i915, "after reset");
> +
> +out:
> + igt_global_reset_unlock(i915);
> +
> + return ok ? 0 : -ESRCH;
> +}
> +
> +static int
> +live_engine_reset_gt_engine_workarounds(void *arg)
> +{
> + struct drm_i915_private *i915 = arg;
> + struct intel_engine_cs *engine;
> + struct i915_gem_context *ctx;
> + struct igt_spinner spin;
> + enum intel_engine_id id;
> + struct i915_request *rq;
> + int ret = 0;
> +
> + if (!intel_has_reset_engine(i915))
> + return 0;
> +
> + ctx = kernel_context(i915);
> + if (IS_ERR(ctx))
> + return PTR_ERR(ctx);
> +
> + for_each_engine(engine, i915, id) {
> + bool ok;
> +
> + pr_info("Verifying after %s reset...\n", engine->name);
> +
> + igt_global_reset_lock(i915);
The key thing with it being global, is that you can take it globally :)
-Chris
More information about the Intel-gfx
mailing list