summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2020-12-03 08:22:17 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2020-12-17 10:49:49 +0000
commitf5b022a2e5054ee7e335d7856344807308db6d6f (patch)
treeeeb6ebce2c65f82870c872c118d41e74d02c854c
parent614885dc005833cc2a5d75e7aad970aaf3b84903 (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.c41
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),