Re: [igt-dev] [PATCH i-g-t v23 22/37] tests/api_intel_bb: Add subtest to check render batch on the last page
From: Daniel Vetter <hidden>
Date: 2021-03-16 11:47:07
On Mon, Mar 15, 2021 at 05:58:27PM +0100, Zbigniew Kempczyński wrote:
Last page (on 48-bit ppgtt) seems to be problematic when full 3D pipeline batch is inserted and executed from it. Try to find out which generations are still prone to hang on it. Signed-off-by: Zbigniew Kempczyński <redacted> Cc: Chris Wilson <redacted>
Discussed this a bit on irc, and this results in failures. I think it's good to have this as a test going forward to make sure hw doesn't break in bad ways, but merging a test that's red for old platforms isn't a good pattern. It's imo part of the reason our CI results look so horrible. So options: - drop this patch - limit the test to only run on modern platforms that don't suck, with a comment explaining where it's broken And I guess need to retract my hurried ack on this patch too :-) -Daniel
quoted hunk ↗ jump to hunk
--- tests/i915/api_intel_bb.c | 75 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+)diff --git a/tests/i915/api_intel_bb.c b/tests/i915/api_intel_bb.c index 29d4dd7b6..7f56c1cbc 100644 --- a/tests/i915/api_intel_bb.c +++ b/tests/i915/api_intel_bb.c@@ -36,6 +36,7 @@ #include <glib.h> #include <zlib.h> #include "intel_bufops.h" +#include "sw_sync.h" #define PAGE_SIZE 4096@@ -1320,6 +1321,77 @@ static void render_ccs(struct buf_ops *bops) igt_assert_f(fails == 0, "render-ccs fails: %d\n", fails); } +static void last_page(struct buf_ops *bops, uint32_t width, uint32_t height) +{ + struct intel_bb *ibb1, *ibb2; + struct intel_buf src, dst; + int i915 = buf_ops_get_fd(bops); + uint32_t devid = intel_get_drm_devid(i915); + igt_render_copyfunc_t render_copy = NULL; + uint64_t gtt_size; + uint64_t ctx; + int ret; + + igt_require(gem_uses_full_ppgtt(i915)); + gtt_size = gem_aperture_size(i915); + + ctx = gem_context_create(i915); + + ibb1 = intel_bb_create_full(i915, ctx, PAGE_SIZE, + 0, gtt_size, INTEL_ALLOCATOR_SIMPLE, + ALLOC_STRATEGY_LOW_TO_HIGH); + + ibb2 = intel_bb_create_full(i915, 0, PAGE_SIZE, + 0, gtt_size, INTEL_ALLOCATOR_SIMPLE, + ALLOC_STRATEGY_HIGH_TO_LOW); + + if (debug_bb) { + intel_bb_set_debug(ibb1, true); + intel_bb_set_debug(ibb2, true); + } + + scratch_buf_init(bops, &src, width, height, I915_TILING_NONE, + I915_COMPRESSION_NONE); + scratch_buf_init(bops, &dst, width, height, I915_TILING_NONE, + I915_COMPRESSION_NONE); + scratch_buf_draw_pattern(bops, &src, + 0, 0, width, height, + 0, 0, width, height, 0); + + render_copy = igt_get_render_copyfunc(devid); + igt_assert(render_copy); + + render_copy(ibb1, + &src, + 0, 0, width, height, + &dst, + 0, 0); + gem_sync(i915, dst.handle); + sync_fence_wait(ibb1->fence, -1); + igt_assert_eq(sync_fence_status(ibb1->fence), 1); + intel_bb_destroy(ibb1); + + intel_buf_close(bops, &dst); + scratch_buf_init(bops, &dst, width, height, I915_TILING_NONE, + I915_COMPRESSION_NONE); + + render_copy(ibb2, + &src, + 0, 0, width, height, + &dst, + 0, 0); + + /* We likely got a hang here, so free resources before assert */ + sync_fence_wait(ibb2->fence, -1); + ret = sync_fence_status(ibb2->fence); + + intel_bb_destroy(ibb2); + intel_buf_close(bops, &src); + intel_buf_close(bops, &dst); + + igt_assert_f(ret == 1, "Batch in last page in rcs leads to hang\n"); +} + static int opt_handler(int opt, int opt_index, void *data) { switch (opt) {@@ -1471,6 +1543,9 @@ igt_main_args("dpib", NULL, help_str, opt_handler, NULL) igt_subtest("render-ccs") render_ccs(bops); + igt_subtest("last-page") + last_page(bops, 512, 512); + igt_fixture { buf_ops_destroy(bops); close(i915);-- 2.26.0 _______________________________________________ igt-dev mailing list igt-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/igt-dev
-- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ igt-dev mailing list igt-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/igt-dev