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; } munmap(ptr, OBJECT_SIZE); signal(SIGBUS, SIG_DFL); }
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); igt_assert(ptr == NULL); igt_assert(errno == EFAULT); close(fd); }
static void dontneed_before_pwrite(void) { int fd = drm_open_driver(DRIVER_INTEL); uint32_t buf[] = { MI_BATCH_BUFFER_END, 0 }; struct drm_i915_gem_pwrite gem_pwrite; gem_pwrite.handle = gem_create(fd, OBJECT_SIZE); gem_pwrite.offset = 0; gem_pwrite.size = sizeof(buf); gem_pwrite.data_ptr = (uintptr_t)buf; gem_madvise(fd, gem_pwrite.handle, I915_MADV_DONTNEED); igt_assert(drmIoctl(fd, DRM_IOCTL_I915_GEM_PWRITE, &gem_pwrite)); igt_assert(errno == EFAULT); gem_close(fd, gem_pwrite.handle); close(fd); }
static void create_and_map_bo(int fd) { uint32_t handle; char *ptr; handle = gem_create(fd, OBJECT_SIZE); ptr = gem_mmap__gtt(fd, handle, OBJECT_SIZE, PROT_READ | PROT_WRITE); /* touch it to force it into the gtt */ *ptr = 0; /* but then unmap it again because we only have limited address space on * 32 bit */ munmap(ptr, OBJECT_SIZE); /* we happily leak objects to exhaust mmap offset space, the kernel will * reap backing storage. */ gem_madvise(fd, handle, I915_MADV_DONTNEED); }
static void dontneed_before_exec(void) { int fd = drm_open_driver(DRIVER_INTEL); struct drm_i915_gem_execbuffer2 execbuf; struct drm_i915_gem_exec_object2 exec; uint32_t buf[] = { MI_BATCH_BUFFER_END, 0 }; memset(&execbuf, 0, sizeof(execbuf)); memset(&exec, 0, sizeof(exec)); exec.handle = gem_create(fd, OBJECT_SIZE); gem_write(fd, exec.handle, 0, buf, sizeof(buf)); gem_madvise(fd, exec.handle, I915_MADV_DONTNEED); execbuf.buffers_ptr = (uintptr_t)&exec; execbuf.buffer_count = 1; execbuf.batch_len = sizeof(buf); gem_execbuf(fd, &execbuf); gem_close(fd, exec.handle); close(fd); }