From 40b586188c021db58a37ef23ac7d3e20547461a1 Mon Sep 17 00:00:00 2001 From: Daniel Vetter Date: Thu, 5 Dec 2013 15:49:58 +0100 Subject: tests/gem_ctx_exec: Add eviction test It didn't pan out at all since atm we don't evict context objects. But maybe it's useful for when that happens. v2: Actually test eviction. Took a while to figure that one out. And indeed the testcase now fails because we don't evict the previous context as we should. Signed-off-by: Daniel Vetter --- tests/Makefile.sources | 2 +- tests/gem_ctx_exec.c | 108 +++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 93 insertions(+), 17 deletions(-) (limited to 'tests') diff --git a/tests/Makefile.sources b/tests/Makefile.sources index 9e0aefe5..aa34aeb2 100644 --- a/tests/Makefile.sources +++ b/tests/Makefile.sources @@ -21,6 +21,7 @@ TESTS_progs_M = \ gem_concurrent_blit \ gem_cs_tlb \ gem_ctx_bad_exec \ + gem_ctx_exec \ gem_dummy_reloc_loop \ gem_evict_alignment \ gem_evict_everything \ @@ -75,7 +76,6 @@ TESTS_progs = \ gem_ctx_bad_destroy \ gem_ctx_basic \ gem_ctx_create \ - gem_ctx_exec \ gem_double_irq_loop \ gem_exec_big \ gem_exec_blt \ diff --git a/tests/gem_ctx_exec.c b/tests/gem_ctx_exec.c index 620a9447..a2153dba 100644 --- a/tests/gem_ctx_exec.c +++ b/tests/gem_ctx_exec.c @@ -93,29 +93,105 @@ static int exec(int fd, uint32_t handle, int ring, int ctx_id) return ret; } -int main(int argc, char *argv[]) +static void big_exec(int fd, uint32_t handle, int ring) { - uint32_t handle; - uint32_t batch[2] = {0, MI_BATCH_BUFFER_END}; - uint32_t ctx_id; - int fd; + struct drm_i915_gem_execbuffer2 execbuf; + struct drm_i915_gem_exec_object2 *gem_exec; + uint32_t ctx_id1, ctx_id2; + int num_buffers = gem_available_aperture_size(fd) / 4096; + int i; + + igt_require(intel_get_total_ram_mb() * 2 * 1024 > num_buffers * 4); + + gem_exec = calloc(num_buffers + 1, sizeof(*gem_exec)); + igt_assert(gem_exec); + memset(gem_exec, 0, (num_buffers + 1) * sizeof(*gem_exec)); + + + ctx_id1 = gem_context_create(fd); + ctx_id2 = gem_context_create(fd); + + gem_exec[0].handle = handle; + + + execbuf.buffers_ptr = (uintptr_t)gem_exec; + execbuf.buffer_count = num_buffers + 1; + execbuf.batch_start_offset = 0; + execbuf.batch_len = 8; + execbuf.cliprects_ptr = 0; + execbuf.num_cliprects = 0; + execbuf.DR1 = 0; + execbuf.DR4 = 0; + execbuf.flags = ring; + execbuf.rsvd2 = 0; + execbuf.buffer_count = 1; + i915_execbuffer2_set_context_id(execbuf, ctx_id1); + igt_assert(drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, + &execbuf) == 0); + + for (i = 0; i < num_buffers; i++) { + uint32_t tmp_handle = gem_create(fd, 4096); + + gem_exec[i].handle = tmp_handle; + } + gem_exec[i].handle = handle; + execbuf.buffer_count = i + 1; + + /* figure out how many buffers we can exactly fit */ + while (drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, + &execbuf) != 0) { + i--; + gem_close(fd, gem_exec[i].handle); + gem_exec[i].handle = handle; + execbuf.buffer_count--; + printf("trying buffer count %i\n", i - 1); + } + + printf("reduced buffer count to %i from %i\n", + i - 1, num_buffers); + + /* double check that it works */ + igt_assert(drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, + &execbuf) == 0); + + i915_execbuffer2_set_context_id(execbuf, ctx_id2); + igt_assert(drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, + &execbuf) == 0); + gem_sync(fd, handle); +} + +uint32_t handle; +uint32_t batch[2] = {0, MI_BATCH_BUFFER_END}; +uint32_t ctx_id; +int fd; + +igt_main +{ igt_skip_on_simulation(); + igt_fixture { + fd = drm_open_any_render(); - fd = drm_open_any_render(); + handle = gem_create(fd, 4096); - ctx_id = gem_context_create(fd); - handle = gem_create(fd, 4096); + /* check that we can create contexts. */ + ctx_id = gem_context_create(fd); + context_destroy(fd, ctx_id); + gem_write(fd, handle, 0, batch, sizeof(batch)); + } - gem_write(fd, handle, 0, batch, sizeof(batch)); - igt_assert(exec(fd, handle, I915_EXEC_RENDER, ctx_id) == 0); - context_destroy(fd, ctx_id); + igt_subtest("basic") { + ctx_id = gem_context_create(fd); + igt_assert(exec(fd, handle, I915_EXEC_RENDER, ctx_id) == 0); + context_destroy(fd, ctx_id); - ctx_id = gem_context_create(fd); - igt_assert(exec(fd, handle, I915_EXEC_RENDER, ctx_id) == 0); - context_destroy(fd, ctx_id); + ctx_id = gem_context_create(fd); + igt_assert(exec(fd, handle, I915_EXEC_RENDER, ctx_id) == 0); + context_destroy(fd, ctx_id); - igt_assert(exec(fd, handle, I915_EXEC_RENDER, ctx_id) < 0); + igt_assert(exec(fd, handle, I915_EXEC_RENDER, ctx_id) < 0); + } - igt_success(); + igt_subtest("eviction") + big_exec(fd, handle, I915_EXEC_RENDER); } -- cgit v1.2.3