summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-03-01 21:18:51 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2016-03-01 22:39:56 +0000
commitfbe92a222ecffbb848147509674b4c12377d7a4d (patch)
tree760ed144ee07538b48d508fe45aaf5c5ce706bc3 /tests
parent1112abe5ece9b2a991c9af2d11b6943784e0e657 (diff)
igt/gem_ctx_create: Exercise a trivial allocation failure
Trying to allocate and use lots of contexts with execlists and !llc end ups in faliure very quickly. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'tests')
-rw-r--r--tests/gem_ctx_create.c83
1 files changed, 65 insertions, 18 deletions
diff --git a/tests/gem_ctx_create.c b/tests/gem_ctx_create.c
index 1ea61f19..0418bf8b 100644
--- a/tests/gem_ctx_create.c
+++ b/tests/gem_ctx_create.c
@@ -29,42 +29,89 @@
#include <stdio.h>
#include <string.h>
#include <errno.h>
+#include <time.h>
+static int __gem_context_create(int fd, struct drm_i915_gem_context_create *arg)
+{
+ int ret = 0;
+ if (drmIoctl(fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, arg))
+ ret = -errno;
+ return ret;
+}
+
+static double elapsed(const struct timespec *start,
+ const struct timespec *end)
+{
+ return (end->tv_sec - start->tv_sec) + 1e-9*(end->tv_nsec - start->tv_nsec);
+}
+
+static void active(int fd, int timeout)
+{
+ const uint32_t bbe = MI_BATCH_BUFFER_END;
+ struct drm_i915_gem_execbuffer2 execbuf;
+ struct drm_i915_gem_exec_object2 obj;
+ struct timespec start, end;
+ unsigned count = 0;
-int ret, fd;
-struct drm_i915_gem_context_create create;
+ memset(&obj, 0, sizeof(obj));
+ obj.handle = gem_create(fd, 4096);
+ gem_write(fd, obj.handle, 0, &bbe, sizeof(bbe));
+
+ memset(&execbuf, 0, sizeof(execbuf));
+ execbuf.buffers_ptr = (uintptr_t)&obj;
+ execbuf.buffer_count = 1;
+
+ clock_gettime(CLOCK_MONOTONIC, &start);
+ do {
+ do {
+
+ execbuf.rsvd1 = gem_context_create(fd);
+ gem_execbuf(fd, &execbuf);
+ gem_context_destroy(fd, execbuf.rsvd1);
+ } while (++count & 1023);
+ clock_gettime(CLOCK_MONOTONIC, &end);
+ } while (elapsed(&start, &end) < timeout);
+
+ gem_sync(fd, obj.handle);
+ clock_gettime(CLOCK_MONOTONIC, &end);
+ igt_info("Context creation + execution: %.3f us\n",
+ elapsed(&start, &end) / count *1e6);
+
+ gem_close(fd, obj.handle);
+}
igt_main
{
- igt_fixture
+ struct drm_i915_gem_context_create create;
+ int fd;
+
+ igt_fixture {
fd = drm_open_driver_render(DRIVER_INTEL);
+ memset(&create, 0, sizeof(create));
+ igt_require(__gem_context_create(fd, &create) == 0);
+ gem_context_destroy(fd, create.ctx_id);
+ }
+
igt_subtest("basic") {
+ memset(&create, 0, sizeof(create));
create.ctx_id = rand();
create.pad = 0;
-
-
- ret = drmIoctl(fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, &create);
- igt_skip_on(ret != 0 && (errno == ENODEV || errno == EINVAL));
- igt_assert(ret == 0);
+ igt_assert_eq(__gem_context_create(fd, &create), 0);
igt_assert(create.ctx_id != 0);
+ gem_context_destroy(fd, create.ctx_id);
}
igt_subtest("invalid-pad") {
+ memset(&create, 0, sizeof(create));
create.ctx_id = rand();
- create.pad = 0;
-
- ret = drmIoctl(fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, &create);
- igt_skip_on(ret != 0 && (errno == ENODEV || errno == EINVAL));
- igt_assert(ret == 0);
- igt_assert(create.ctx_id != 0);
-
create.pad = 1;
-
- igt_assert(drmIoctl(fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, &create) < 0 &&
- errno == EINVAL);
+ igt_assert_eq(__gem_context_create(fd, &create), -EINVAL);
}
+ igt_subtest("active")
+ active(fd, 20);
+
igt_fixture
close(fd);
}