[igt-dev] [PATCH i-g-t v7 2/3] i915/gem_ctx_isolation: Change semantics of ctx isolation uAPI
Kamil Konieczny
kamil.konieczny at linux.intel.com
Fri Oct 28 09:05:14 UTC 2022
Hi Adrian,
On 2022-10-19 at 15:40:47 +0100, Adrian Larumbe wrote:
> ioctl I915_PARAM_HAS_CONTEXT_ISOLATION param is meant to report whether all
> the engines in the system support context isolation, but the way the return
> value was being used did not respect the contract on the uAPI.
>
> Also reckon whether engine has context isolation in user space, rather than
> relying on a bitmask provided by the I915_PARAM_HAS_CONTEXT_ISOLATION ioctl,
> which is due to change to a single boolean value.
>
> Skip all engine tests for which context isolation is not supported.
>
> Signed-off-by: Adrian Larumbe <adrian.larumbe at collabora.com>
> ---
> tests/i915/gem_ctx_isolation.c | 67 +++++++++++++++++-----------------
> 1 file changed, 34 insertions(+), 33 deletions(-)
>
> diff --git a/tests/i915/gem_ctx_isolation.c b/tests/i915/gem_ctx_isolation.c
> index dc52a9a03130..95f55c4b9c98 100644
> --- a/tests/i915/gem_ctx_isolation.c
> +++ b/tests/i915/gem_ctx_isolation.c
> @@ -626,6 +626,19 @@ static void compare_regs(int fd, const struct intel_execution_engine2 *e,
> num_errors, who);
> }
>
Please write comment here why we need this function instead of
ioctl.
> +static bool
> +engine_has_context_isolation(const struct intel_execution_engine2 *e,
> + int gen)
> +{
> + if (gen > 8)
> + return true;
> +
> + if (gen >= 6 && gen <= 8 && e->class == I915_ENGINE_CLASS_RENDER)
> + return true;
> +
> + return false;
> +}
> +
> static void nonpriv(int fd, const intel_ctx_cfg_t *cfg,
> const struct intel_execution_engine2 *e,
> unsigned int flags)
> @@ -643,9 +656,11 @@ static void nonpriv(int fd, const intel_ctx_cfg_t *cfg,
> 0xdeadbeef
> };
> unsigned int num_values = ARRAY_SIZE(values);
> + unsigned int gen = intel_gen(intel_get_drm_devid(fd));
>
> /* Sigh -- hsw: we need cmdparser access to our own registers! */
> igt_skip_on(intel_gen(intel_get_drm_devid(fd)) < 8);
> + igt_require(engine_has_context_isolation(e, gen));
>
> gem_quiescent_gpu(fd);
>
> @@ -741,6 +756,9 @@ static void isolation(int fd, const intel_ctx_cfg_t *cfg,
> };
> unsigned int num_values =
> flags & (DIRTY1 | DIRTY2) ? ARRAY_SIZE(values) : 1;
> + unsigned int gen = intel_gen(intel_get_drm_devid(fd));
> +
> + igt_require(engine_has_context_isolation(e, gen));
>
> gem_quiescent_gpu(fd);
>
> @@ -875,12 +893,15 @@ static void preservation(int fd, const intel_ctx_cfg_t *cfg,
> 0xaaaaaaaa,
> 0xdeadbeef
> };
> + unsigned int gen = intel_gen(intel_get_drm_devid(fd));
> const unsigned int num_values = ARRAY_SIZE(values);
> const intel_ctx_t *ctx[num_values + 1];
> uint32_t regs[num_values + 1][2];
> uint64_t ahnd[num_values + 1];
> igt_spin_t *spin;
>
> + igt_require(engine_has_context_isolation(e, gen));
> +
> gem_quiescent_gpu(fd);
>
> ctx[num_values] = intel_ctx_create(fd, cfg);
> @@ -955,45 +976,25 @@ static void preservation(int fd, const intel_ctx_cfg_t *cfg,
> put_ahnd(ahnd[num_values]);
> }
>
> -static unsigned int __has_context_isolation(int fd)
> -{
> - struct drm_i915_getparam gp;
> - int value = 0;
> -
> - memset(&gp, 0, sizeof(gp));
> - gp.param = 50; /* I915_PARAM_HAS_CONTEXT_ISOLATION */
> - gp.value = &value;
> -
> - igt_ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
> - errno = 0;
> -
> - return value;
> -}
Do not remove this function, rather change it to use uAPI as
you described, so this should be:
static bool __has_context_isolation(int fd)
and
igt_ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
if (errno) {
errno = 0;
value = 0;
}
return value != 0;
> -
> - return value;
> -
> -#define test_each_engine(e, i915, cfg, mask) \
> +#define test_each_engine(e, i915, cfg) \
> for_each_ctx_cfg_engine(i915, cfg, e) \
> - for_each_if(mask & (1 << (e)->class)) \
> - igt_dynamic_f("%s", (e)->name)
> + igt_dynamic_f("%s", (e)->name)
>
> igt_main
> {
> - unsigned int has_context_isolation = 0;
> const struct intel_execution_engine2 *e;
> intel_ctx_cfg_t cfg;
> igt_fd_t(i915);
> + unsigned int gen;
>
> igt_fixture {
> - int gen;
> -
> i915 = drm_open_driver(DRIVER_INTEL);
> igt_require_gem(i915);
> igt_require(gem_has_contexts(i915));
> cfg = intel_ctx_cfg_all_physical(i915);
>
> - has_context_isolation = __has_context_isolation(i915);
> - igt_require(has_context_isolation);
Do not remove these two lines.
> -
> gen = intel_gen(intel_get_drm_devid(i915));
> + igt_require(gen >= 2);
Drop this.
Regards,
Kamil
>
> igt_warn_on_f(gen > LAST_KNOWN_GEN,
> "GEN not recognized! Test needs to be updated to run.\n");
> @@ -1005,42 +1006,42 @@ igt_main
> }
>
> igt_subtest_with_dynamic("nonpriv") {
> - test_each_engine(e, i915, &cfg, has_context_isolation)
> + test_each_engine(e, i915, &cfg)
> nonpriv(i915, &cfg, e, 0);
> }
>
> igt_subtest_with_dynamic("nonpriv-switch") {
> - test_each_engine(e, i915, &cfg, has_context_isolation)
> + test_each_engine(e, i915, &cfg)
> nonpriv(i915, &cfg, e, DIRTY2);
> }
>
> igt_subtest_with_dynamic("clean") {
> - test_each_engine(e, i915, &cfg, has_context_isolation)
> + test_each_engine(e, i915, &cfg)
> isolation(i915, &cfg, e, 0);
> }
>
> igt_subtest_with_dynamic("dirty-create") {
> - test_each_engine(e, i915, &cfg, has_context_isolation)
> + test_each_engine(e, i915, &cfg)
> isolation(i915, &cfg, e, DIRTY1);
> }
>
> igt_subtest_with_dynamic("dirty-switch") {
> - test_each_engine(e, i915, &cfg, has_context_isolation)
> + test_each_engine(e, i915, &cfg)
> isolation(i915, &cfg, e, DIRTY2);
> }
>
> igt_subtest_with_dynamic("preservation") {
> - test_each_engine(e, i915, &cfg, has_context_isolation)
> + test_each_engine(e, i915, &cfg)
> preservation(i915, &cfg, e, 0);
> }
>
> igt_subtest_with_dynamic("preservation-S3") {
> - test_each_engine(e, i915, &cfg, has_context_isolation)
> + test_each_engine(e, i915, &cfg)
> preservation(i915, &cfg, e, S3);
> }
>
> igt_subtest_with_dynamic("preservation-S4") {
> - test_each_engine(e, i915, &cfg, has_context_isolation)
> + test_each_engine(e, i915, &cfg)
> preservation(i915, &cfg, e, S4);
> }
>
> @@ -1051,7 +1052,7 @@ igt_main
> igt_subtest_with_dynamic("preservation-reset") {
> igt_hang_t hang = igt_allow_hang(i915, 0, 0);
>
> - test_each_engine(e, i915, &cfg, has_context_isolation)
> + test_each_engine(e, i915, &cfg)
> preservation(i915, &cfg, e, RESET);
>
> igt_disallow_hang(i915, hang);
> --
> 2.38.0
>
More information about the igt-dev
mailing list