diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2020-12-03 08:22:17 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2020-12-17 10:49:49 +0000 |
commit | f5b022a2e5054ee7e335d7856344807308db6d6f (patch) | |
tree | eeb6ebce2c65f82870c872c118d41e74d02c854c | |
parent | 614885dc005833cc2a5d75e7aad970aaf3b84903 (diff) |
i915/api_intel_bb: Only assert objects are unmoved for full-ppgtt
If we let an object idle in a shared GTT, it may be evicted by the
kernel in favour of another client. Thus, we have to be very careful
when asserting that two different executions of the same object will
be at the same address. If there's an idle point between the two
asserts, it will only be guaranteed to hold for full-ppgtt.
Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/2810
References: c20db20a7cd7 ("i915/api_intel_bb: Only assert objects are unmoved for full-ppgtt")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
Acked-by: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
-rw-r--r-- | tests/i915/api_intel_bb.c | 41 |
1 files changed, 22 insertions, 19 deletions
diff --git a/tests/i915/api_intel_bb.c b/tests/i915/api_intel_bb.c index d423b627..cc1d1be6 100644 --- a/tests/i915/api_intel_bb.c +++ b/tests/i915/api_intel_bb.c @@ -485,25 +485,6 @@ static void blit(struct buf_ops *bops, igt_debug("bb2 presumed offset: 0x%"PRIx64"\n", poff2_bb); igt_debug("src2 presumed offset: 0x%"PRIx64"\n", poff2_src); igt_debug("dst2 presumed offset: 0x%"PRIx64"\n", poff2_dst); - if (purge_cache) { - if (do_relocs) { - igt_assert(poff2_bb == 0); - igt_assert(poff2_src == 0); - igt_assert(poff2_dst == 0); - } else { - igt_assert(poff_bb != poff2_bb); - igt_assert(poff_src == poff2_src); - igt_assert(poff_dst == poff2_dst); - } - } else { - igt_assert(poff_bb == poff2_bb); - igt_assert(poff_src == poff2_src); - igt_assert(poff_dst == poff2_dst); - } - - intel_bb_emit_bbe(ibb); - intel_bb_exec(ibb, intel_bb_offset(ibb), flags, true); - check_buf(dst, COLOR_77); /* * Since we let the objects idle, if the GTT is shared, another client @@ -515,6 +496,28 @@ static void blit(struct buf_ops *bops, * we are in full control of our own GTT. */ if (gem_uses_full_ppgtt(i915)) { + if (purge_cache) { + if (do_relocs) { + igt_assert_eq_u64(poff2_bb, 0); + igt_assert_eq_u64(poff2_src, 0); + igt_assert_eq_u64(poff2_dst, 0); + } else { + igt_assert_neq_u64(poff_bb, poff2_bb); + igt_assert_eq_u64(poff_src, poff2_src); + igt_assert_eq_u64(poff_dst, poff2_dst); + } + } else { + igt_assert_eq_u64(poff_bb, poff2_bb); + igt_assert_eq_u64(poff_src, poff2_src); + igt_assert_eq_u64(poff_dst, poff2_dst); + } + } + + intel_bb_emit_bbe(ibb); + intel_bb_exec(ibb, intel_bb_offset(ibb), flags, true); + check_buf(dst, COLOR_77); + + if (gem_uses_full_ppgtt(i915)) { igt_assert_eq_u64(intel_bb_get_object_offset(ibb, src->handle), poff_src); igt_assert_eq_u64(intel_bb_get_object_offset(ibb, dst->handle), |