map-fixed-invalidate* subtests utilize gem_set_tiling() which may fail, e.g. on hardware with no mappable aperture, due to missing fences. Skip those subtests if fences are not available. Moreover, those subtests use GEM_MMAP_GTT IOCTL which has been replaced by GEM_MMAP_OFFSET that supports other mapping types, not only GTT. Use the new IOCTL and dynamically examine all MMAP_OFFSET types supported by hardware. v2: Examine all supported MMAP_OFFSET types, not only the first one that works, - add subtest description. Signed-off-by: Janusz Krzysztofik <janusz.krzysztofik@xxxxxxxxxxxxxxx> Cc: Michał Winiarski <michal.winiarski@xxxxxxxxx> --- As advised by Michał, we believe that running those subtests on platforms which do support tiling while skipping them on those which don't is sufficient for detecting potential lockdep loops in scenarios covered by those subtests. tests/i915/gem_userptr_blits.c | 43 +++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/tests/i915/gem_userptr_blits.c b/tests/i915/gem_userptr_blits.c index a8d3783fb..fdfb5853c 100644 --- a/tests/i915/gem_userptr_blits.c +++ b/tests/i915/gem_userptr_blits.c @@ -722,7 +722,8 @@ static void test_forked_access(int fd) MAP_FIXED_INVALIDATE_BUSY | \ MAP_FIXED_INVALIDATE_GET_PAGES) -static int test_map_fixed_invalidate(int fd, uint32_t flags) +static int test_map_fixed_invalidate(int fd, uint32_t flags, + const struct mmap_offset *t) { const size_t ptr_size = sizeof(linear) + 2*PAGE_SIZE; const int num_handles = (flags & MAP_FIXED_INVALIDATE_OVERLAP) ? 2 : 1; @@ -741,7 +742,7 @@ static int test_map_fixed_invalidate(int fd, uint32_t flags) for (char *fixed = (char *)ptr, *end = fixed + ptr_size; fixed + 2*PAGE_SIZE <= end; fixed += PAGE_SIZE) { - struct drm_i915_gem_mmap_gtt mmap_gtt; + struct drm_i915_gem_mmap_offset mmap_offset; uint32_t *map; map = mmap(ptr, ptr_size, PROT_READ | PROT_WRITE, @@ -750,9 +751,13 @@ static int test_map_fixed_invalidate(int fd, uint32_t flags) igt_assert(map != MAP_FAILED); igt_assert(map == ptr); - memset(&mmap_gtt, 0, sizeof(mmap_gtt)); - mmap_gtt.handle = gem_create(fd, 2*PAGE_SIZE); - do_ioctl(fd, DRM_IOCTL_I915_GEM_MMAP_GTT, &mmap_gtt); + memset(&mmap_offset, 0, sizeof(mmap_offset)); + mmap_offset.handle = gem_create(fd, 2 * PAGE_SIZE); + mmap_offset.flags = t->type; + igt_skip_on_f(igt_ioctl(fd, DRM_IOCTL_I915_GEM_MMAP_OFFSET, + &mmap_offset), + "HW & kernel support for mmap_offset(%s)\n", + t->name); if (flags & MAP_FIXED_INVALIDATE_GET_PAGES) igt_assert_eq(__gem_set_domain(fd, handle[0], @@ -766,11 +771,11 @@ static int test_map_fixed_invalidate(int fd, uint32_t flags) map = mmap(fixed, 2*PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, - fd, mmap_gtt.offset); + fd, mmap_offset.offset); igt_assert(map != MAP_FAILED); igt_assert(map == (uint32_t *)fixed); - gem_set_tiling(fd, mmap_gtt.handle, I915_TILING_NONE, 0); + gem_set_tiling(fd, mmap_offset.handle, I915_TILING_NONE, 0); *map = 0xdead; if (flags & MAP_FIXED_INVALIDATE_GET_PAGES) { @@ -784,10 +789,10 @@ static int test_map_fixed_invalidate(int fd, uint32_t flags) handle[0] = create_userptr(fd, 0, ptr + PAGE_SIZE/sizeof(*ptr)); } - gem_set_tiling(fd, mmap_gtt.handle, I915_TILING_Y, 512 * 4); + gem_set_tiling(fd, mmap_offset.handle, I915_TILING_Y, 512 * 4); *(uint32_t*)map = 0xbeef; - gem_close(fd, mmap_gtt.handle); + gem_close(fd, mmap_offset.handle); } for (int i = 0; i < num_handles; i++) @@ -2166,11 +2171,21 @@ igt_main_args("c:", NULL, help_str, opt_handler, NULL) test_invalidate_close_race(fd, true); for (unsigned flags = 0; flags < ALL_MAP_FIXED_INVALIDATE + 1; flags++) { - igt_subtest_f("map-fixed-invalidate%s%s%s", - flags & MAP_FIXED_INVALIDATE_OVERLAP ? "-overlap" : "", - flags & MAP_FIXED_INVALIDATE_BUSY ? "-busy" : "", - flags & MAP_FIXED_INVALIDATE_GET_PAGES ? "-gup" : "") { - test_map_fixed_invalidate(fd, flags); + igt_describe("Try to anger lockdep with MMU notifier still active after MAP_FIXED remap"); + igt_subtest_with_dynamic_f("map-fixed-invalidate%s%s%s", + flags & MAP_FIXED_INVALIDATE_OVERLAP ? + "-overlap" : "", + flags & MAP_FIXED_INVALIDATE_BUSY ? + "-busy" : "", + flags & MAP_FIXED_INVALIDATE_GET_PAGES ? + "-gup" : "") { + igt_require_f(gem_available_fences(fd), + "HW & kernel support for tiling\n"); + + for_each_mmap_offset_type(t) + igt_dynamic_f("%s", t->name) + test_map_fixed_invalidate(fd, + flags, t); } } -- 2.21.0 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx