diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2019-08-09 15:00:39 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2019-08-13 16:41:53 +0100 |
commit | eced11670da92bc338a162af6eeda39edd49cd12 (patch) | |
tree | b7866e4b5bb129e2937d049a19a4f74fab99ecf3 /tests | |
parent | 5b41a9e291bb993a7167595115f2876078b31caa (diff) |
i915/gem_userptr_blits: Apply some THP pressure
Still trying to hit a deadlock with userptr from kcompatcd.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reveiwed-by: Andi Shyti <andi.shyti@intel.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/i915/gem_userptr_blits.c | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/tests/i915/gem_userptr_blits.c b/tests/i915/gem_userptr_blits.c index 1373f160..5f7770c9 100644 --- a/tests/i915/gem_userptr_blits.c +++ b/tests/i915/gem_userptr_blits.c @@ -1662,20 +1662,24 @@ struct stress_thread_data { static void *mm_stress_thread(void *data) { struct stress_thread_data *stdata = (struct stress_thread_data *)data; + const size_t sz = 2 << 20; void *ptr; - int ret; while (!stdata->stop) { - ptr = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + ptr = mmap(NULL, sz, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (ptr == MAP_FAILED) { stdata->exit_code = -EFAULT; break; } - ret = munmap(ptr, PAGE_SIZE); - if (ret) { - stdata->exit_code = errno; - break; + + madvise(ptr, sz, MADV_HUGEPAGE); + for (size_t page = 0; page < sz; page += PAGE_SIZE) + *(volatile uint32_t *)((unsigned char *)ptr + page) = 0; + + if (munmap(ptr, sz)) { + stdata->exit_code = errno; + break; } } @@ -1713,6 +1717,35 @@ static void test_stress_mm(int fd) igt_assert_eq(stdata.exit_code, 0); } +static void test_stress_purge(int fd) +{ + struct stress_thread_data stdata; + uint32_t handle; + pthread_t t; + void *ptr; + + memset(&stdata, 0, sizeof(stdata)); + + igt_assert(posix_memalign(&ptr, PAGE_SIZE, PAGE_SIZE) == 0); + igt_assert(!pthread_create(&t, NULL, mm_stress_thread, &stdata)); + + igt_until_timeout(150) { + gem_userptr(fd, ptr, PAGE_SIZE, 0, userptr_flags, &handle); + + gem_set_domain(fd, handle, + I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT); + intel_purge_vm_caches(fd); + + gem_close(fd, handle); + } + + free(ptr); + + stdata.stop = 1; + igt_assert(!pthread_join(t, NULL)); + igt_assert_eq(stdata.exit_code, 0); +} + struct userptr_close_thread_data { int fd; void *ptr; @@ -1975,6 +2008,8 @@ igt_main_args("c:", NULL, help_str, opt_handler, NULL) igt_subtest("stress-mm") test_stress_mm(fd); + igt_subtest("stress-purge") + test_stress_purge(fd); igt_subtest("stress-mm-invalidate-close") test_invalidate_close_race(fd, false); |