diff options
author | Vinay Belgaumkar <vinay.belgaumkar@intel.com> | 2020-01-30 13:44:55 -0800 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2020-01-31 10:17:55 +0000 |
commit | 92132fa31bb528eec98cbfd027a5c33095155f82 (patch) | |
tree | e76ba953c222d37205578eed69641693a3633465 /tests/i915/gem_madvise.c | |
parent | f35a238f80c6bc695d4c60446f5a2400f80c44f2 (diff) |
i915/gem_madvise: Use gem_mmap_offset
Update test to use mmap_offset which allows test execution
on platforms without aperture. Iterate the test for GTT and
WC mapping types.
Signed-off-by: Antonio Argenziano <antonio.argenziano@intel.com>
Signed-off-by: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'tests/i915/gem_madvise.c')
-rw-r--r-- | tests/i915/gem_madvise.c | 128 |
1 files changed, 87 insertions, 41 deletions
diff --git a/tests/i915/gem_madvise.c b/tests/i915/gem_madvise.c index 7162a5c3..8baef0d9 100644 --- a/tests/i915/gem_madvise.c +++ b/tests/i915/gem_madvise.c @@ -43,70 +43,116 @@ IGT_TEST_DESCRIPTION("Checks that the kernel reports EFAULT when trying to use" #define OBJECT_SIZE (1024*1024) -/* Testcase: checks that the kernel reports EFAULT when trying to use purged bo +/* + * Testcase: checks that the kernel reports EFAULT when trying to use purged bo * */ +static const struct mmap_offset { + const char *name; + unsigned int type; + unsigned int domain; +} mmap_offset_types[] = { + { "gtt", I915_MMAP_OFFSET_GTT, I915_GEM_DOMAIN_GTT }, + { "wb", I915_MMAP_OFFSET_WB, I915_GEM_DOMAIN_CPU }, + { "wc", I915_MMAP_OFFSET_WC, I915_GEM_DOMAIN_WC }, + { "uc", I915_MMAP_OFFSET_UC, I915_GEM_DOMAIN_WC }, + {}, +}; + +#define for_each_mmap_offset_type(__t) \ + for (const struct mmap_offset *__t = mmap_offset_types; \ + (__t)->name; \ + (__t)++) + + static jmp_buf jmp; static void __attribute__((noreturn)) sigtrap(int sig) { - longjmp(jmp, sig); + siglongjmp(jmp, sig); } static void dontneed_before_mmap(void) { - int fd = drm_open_driver(DRIVER_INTEL); uint32_t handle; char *ptr; - - handle = gem_create(fd, OBJECT_SIZE); - gem_madvise(fd, handle, I915_MADV_DONTNEED); - ptr = gem_mmap__gtt(fd, handle, OBJECT_SIZE, PROT_READ | PROT_WRITE); - close(fd); - - signal(SIGSEGV, sigtrap); - signal(SIGBUS, sigtrap); - switch (setjmp(jmp)) { - case SIGBUS: - break; - case 0: - *ptr = 0; - default: - igt_assert(!"reached"); - break; + int fd; + + for_each_mmap_offset_type(t) { + sighandler_t old_sigsegv, old_sigbus; + + igt_debug("Mapping mode: %s\n", t->name); + + fd = drm_open_driver(DRIVER_INTEL); + handle = gem_create(fd, OBJECT_SIZE); + gem_madvise(fd, handle, I915_MADV_DONTNEED); + + ptr = __gem_mmap_offset(fd, handle, 0, OBJECT_SIZE, + PROT_READ | PROT_WRITE, + t->type); + + close(fd); + if (!ptr) + continue; + + old_sigsegv = signal(SIGSEGV, sigtrap); + old_sigbus = signal(SIGBUS, sigtrap); + switch (sigsetjmp(jmp, SIGBUS | SIGSEGV)) { + case SIGBUS: + break; + case 0: + *ptr = 0; + default: + igt_assert(!"reached"); + break; + } + munmap(ptr, OBJECT_SIZE); + signal(SIGBUS, old_sigsegv); + signal(SIGSEGV, old_sigbus); } - munmap(ptr, OBJECT_SIZE); - signal(SIGBUS, SIG_DFL); - signal(SIGSEGV, SIG_DFL); } static void dontneed_after_mmap(void) { - int fd = drm_open_driver(DRIVER_INTEL); uint32_t handle; char *ptr; - - handle = gem_create(fd, OBJECT_SIZE); - ptr = gem_mmap__gtt(fd, handle, OBJECT_SIZE, PROT_READ | PROT_WRITE); - igt_assert(ptr); - gem_madvise(fd, handle, I915_MADV_DONTNEED); - close(fd); - - signal(SIGBUS, sigtrap); - switch (setjmp(jmp)) { - case SIGBUS: - break; - case 0: - *ptr = 0; - default: - igt_assert(!"reached"); - break; + int fd; + + for_each_mmap_offset_type(t) { + sighandler_t old_sigsegv, old_sigbus; + + igt_debug("Mapping mode: %s\n", t->name); + + fd = drm_open_driver(DRIVER_INTEL); + handle = gem_create(fd, OBJECT_SIZE); + + ptr = __gem_mmap_offset(fd, handle, 0, OBJECT_SIZE, + PROT_READ | PROT_WRITE, + t->type); + + gem_madvise(fd, handle, I915_MADV_DONTNEED); + close(fd); + if (!ptr) + continue; + + old_sigsegv = signal(SIGSEGV, sigtrap); + old_sigbus = signal(SIGBUS, sigtrap); + switch (sigsetjmp(jmp, SIGBUS | SIGSEGV)) { + case SIGBUS: + break; + case 0: + *ptr = 0; + default: + igt_assert(!"reached"); + break; + } + munmap(ptr, OBJECT_SIZE); + signal(SIGBUS, old_sigbus); + signal(SIGSEGV, old_sigsegv); } - munmap(ptr, OBJECT_SIZE); - signal(SIGBUS, SIG_DFL); } static void |