summaryrefslogtreecommitdiff
path: root/tests/i915/gem_exec_parallel.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2020-03-03 14:01:33 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2020-03-03 14:52:49 +0000
commit75b3bcd33ce9679d8b12d04a63d3a66e7aaf68e5 (patch)
treef7be27e4e0caeff24d7e93fb98bc261f071c381e /tests/i915/gem_exec_parallel.c
parent91b36b61e76901a2bd09fe93ac7bf7b8a60f258c (diff)
i915/gem_exec_parallel: Try to trim runtime
In all likelihood the runtime is consumed by the thread setup, but just in case it is dominated by the execbuf, make sure that is bounded. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Diffstat (limited to 'tests/i915/gem_exec_parallel.c')
-rw-r--r--tests/i915/gem_exec_parallel.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/tests/i915/gem_exec_parallel.c b/tests/i915/gem_exec_parallel.c
index 0d4d6c62..f6c1b0e9 100644
--- a/tests/i915/gem_exec_parallel.c
+++ b/tests/i915/gem_exec_parallel.c
@@ -42,22 +42,27 @@
#define VERIFY 0
+static inline uint32_t hash32(uint32_t val)
+{
+#define GOLDEN_RATIO_32 0x61C88647
+ return val * GOLDEN_RATIO_32;
+}
+
static void check_bo(int fd, uint32_t handle, int pass)
{
- uint32_t *map;
- int i;
+ uint32_t x = hash32(handle * pass) % (4096 / sizeof(uint32_t);
+ uint32_t result;
igt_debug("Verifying result (pass=%d, handle=%d)\n", pass, handle);
- map = gem_mmap__cpu(fd, handle, 0, 4096, PROT_READ);
- gem_set_domain(fd, handle, I915_GEM_DOMAIN_CPU, 0);
- for (i = 0; i < 1024; i++)
- igt_assert_eq(map[i], i);
- munmap(map, 4096);
+ gem_read(fd, handle, x * sizeof(result), &result, sizeof(result));
+ igt_assert_eq_u32(result, x);
}
#define CONTEXTS 0x1
#define FDS 0x2
+#define NUMOBJ 16
+
struct thread {
pthread_t thread;
pthread_mutex_t *mutex;
@@ -132,8 +137,8 @@ static void *thread(void *data)
execbuf.rsvd1 = gem_context_clone_with_engines(fd, 0);
}
- for (i = 0; i < 16; i++) {
- obj[0].handle = t->scratch[i];
+ igt_until_timeout(1) {
+ obj[0].handle = t->scratch[i++ % NUMOBJ];
if (t->flags & FDS)
obj[0].handle = gem_open(fd, obj[0].handle);
@@ -160,7 +165,7 @@ static void all(int fd, struct intel_execution_engine2 *engine, unsigned flags)
struct thread *threads;
unsigned engines[16];
unsigned nengine;
- uint32_t scratch[16], handle[16];
+ uint32_t scratch[NUMOBJ], handle[NUMOBJ];
int go;
int i;
@@ -185,7 +190,7 @@ static void all(int fd, struct intel_execution_engine2 *engine, unsigned flags)
}
igt_require(nengine);
- for (i = 0; i < 16; i++) {
+ for (i = 0; i < NUMOBJ; i++) {
scratch[i] = handle[i] = gem_create(fd, 4096);
if (flags & FDS)
scratch[i] = gem_flink(fd, handle[i]);
@@ -221,7 +226,7 @@ static void all(int fd, struct intel_execution_engine2 *engine, unsigned flags)
for (i = 0; i < 1024; i++)
pthread_join(threads[i].thread, NULL);
- for (i = 0; i < 16; i++) {
+ for (i = 0; i < NUMOBJ; i++) {
check_bo(fd, handle[i], i);
gem_close(fd, handle[i]);
}