summaryrefslogtreecommitdiff
path: root/tests/gem_ctx_switch.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/gem_ctx_switch.c')
-rw-r--r--tests/gem_ctx_switch.c51
1 files changed, 31 insertions, 20 deletions
diff --git a/tests/gem_ctx_switch.c b/tests/gem_ctx_switch.c
index 2827b7fc..691a4f1f 100644
--- a/tests/gem_ctx_switch.c
+++ b/tests/gem_ctx_switch.c
@@ -66,14 +66,14 @@ static double elapsed(const struct timespec *start, const struct timespec *end)
static void single(int fd, uint32_t handle,
const struct intel_execution_engine *e,
- unsigned flags)
+ unsigned flags,
+ const int ncpus)
{
struct drm_i915_gem_execbuffer2 execbuf;
struct drm_i915_gem_exec_object2 obj;
struct drm_i915_gem_relocation_entry reloc;
- struct timespec start, now;
uint32_t contexts[64];
- unsigned int count = 0;
+ int child;
int n;
gem_require_ring(fd, e->exec_id | e->flags);
@@ -111,24 +111,30 @@ static void single(int fd, uint32_t handle,
}
gem_sync(fd, handle);
- clock_gettime(CLOCK_MONOTONIC, &start);
- do {
- igt_interruptible(flags & INTERRUPTIBLE) {
- for (int loop = 0; loop < 1024; loop++) {
- execbuf.rsvd1 = contexts[loop % 64];
- reloc.presumed_offset = 0;
- gem_execbuf(fd, &execbuf);
+ igt_fork(child, ncpus) {
+ struct timespec start, now;
+ unsigned int count = 0;
+
+ clock_gettime(CLOCK_MONOTONIC, &start);
+ do {
+ igt_interruptible(flags & INTERRUPTIBLE) {
+ for (int loop = 0; loop < 1024; loop++) {
+ execbuf.rsvd1 = contexts[loop % 64];
+ reloc.presumed_offset = 0;
+ gem_execbuf(fd, &execbuf);
+ }
+ count += 1024;
}
- count += 1024;
- }
+ clock_gettime(CLOCK_MONOTONIC, &now);
+ } while (elapsed(&start, &now) < 20.);
+ gem_sync(fd, handle);
clock_gettime(CLOCK_MONOTONIC, &now);
- } while (elapsed(&start, &now) < 20.);
- gem_sync(fd, handle);
- clock_gettime(CLOCK_MONOTONIC, &now);
- igt_info("%s: %'u cycles: %.3fus%s\n",
- e->name, count, elapsed(&start, &now)*1e6 / count,
- flags & INTERRUPTIBLE ? " (interruptible)" : "");
+ igt_info("[%d] %s: %'u cycles: %.3fus%s\n",
+ child, e->name, count, elapsed(&start, &now)*1e6 / count,
+ flags & INTERRUPTIBLE ? " (interruptible)" : "");
+ }
+ igt_waitchildren();
for (n = 0; n < 64; n++)
gem_context_destroy(fd, contexts[n]);
@@ -136,6 +142,7 @@ static void single(int fd, uint32_t handle,
igt_main
{
+ const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
const struct intel_execution_engine *e;
uint32_t handle = 0;
int fd = -1;
@@ -152,9 +159,13 @@ igt_main
for (e = intel_execution_engines; e->name; e++) {
igt_subtest_f("%s%s", e->exec_id == 0 ? "basic-" : "", e->name)
- single(fd, handle, e, 0);
+ single(fd, handle, e, 0, 1);
igt_subtest_f("%s-interruptible", e->name)
- single(fd, handle, e, INTERRUPTIBLE);
+ single(fd, handle, e, INTERRUPTIBLE, 1);
+ igt_subtest_f("forked-%s", e->name)
+ single(fd, handle, e, 0, ncpus);
+ igt_subtest_f("forked-%s-interruptible", e->name)
+ single(fd, handle, e, INTERRUPTIBLE, ncpus);
}
igt_stop_hang_detector();