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);
}