[PATCH i-g-t 2/3] hostile-int
Chris Wilson
chris at chris-wilson.co.uk
Thu Jul 23 11:20:33 UTC 2020
---
lib/i915/gem_mman.h | 5 +--
tests/i915/gem_exec_hostile.c | 78 +++++++++++++++++++++++++++++++++++
2 files changed, 79 insertions(+), 4 deletions(-)
diff --git a/lib/i915/gem_mman.h b/lib/i915/gem_mman.h
index 2c4a7a00b..349eafb56 100644
--- a/lib/i915/gem_mman.h
+++ b/lib/i915/gem_mman.h
@@ -26,6 +26,7 @@
#define GEM_MMAN_H
#include <stdint.h>
+#include <stdbool.h>
void *gem_mmap__gtt(int fd, uint32_t handle, uint64_t size, unsigned prot);
void *gem_mmap__cpu(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsigned prot);
@@ -42,10 +43,6 @@ void *gem_mmap__device_coherent(int fd, uint32_t handle, uint64_t offset,
void *gem_mmap__cpu_coherent(int fd, uint32_t handle, uint64_t offset,
uint64_t size, unsigned prot);
-#ifndef I915_GEM_DOMAIN_WC
-#define I915_GEM_DOMAIN_WC 0x80
-#endif
-
bool gem_has_mappable_ggtt(int i915);
void gem_require_mappable_ggtt(int i915);
bool gem_has_mmap_offset(int fd);
diff --git a/tests/i915/gem_exec_hostile.c b/tests/i915/gem_exec_hostile.c
index 743dbe7c3..588a4cd25 100644
--- a/tests/i915/gem_exec_hostile.c
+++ b/tests/i915/gem_exec_hostile.c
@@ -23,9 +23,12 @@
#include <fcntl.h>
#include <sys/ioctl.h>
+#include <sys/poll.h>
#include "i915/gem.h"
+#include "i915/gem_mman.h"
#include "igt.h"
+#include "igt_perf.h"
#define MI_INSTR(opcode, flags) (((opcode) << 23) | (flags))
@@ -303,6 +306,78 @@ static void far_fence(int i915)
gem_close(i915, handle);
}
+static void many_interrupts(int i915)
+{
+ const int gen = intel_gen(intel_get_drm_devid(i915));
+ const struct intel_execution_engine2 *e;
+ unsigned int sz = 4 << 20;
+ struct drm_i915_gem_exec_object2 obj = {
+ .handle = gem_create(i915, sz),
+ .flags = EXEC_OBJECT_PINNED,
+ .offset = 48 << 20,
+ };
+ struct drm_i915_gem_execbuffer2 execbuf = {
+ .buffers_ptr = to_user_pointer(&obj),
+ .buffer_count = 1,
+ };
+ uint32_t *cs, *map, *end;
+ uint64_t i_before[2], i_after[2];
+ int fd;
+
+ fd = perf_i915_open(i915, I915_PMU_INTERRUPTS);
+
+ map = cs = gem_mmap__device_coherent(i915, obj.handle, 0, sz, PROT_WRITE);
+ for (unsigned int n = 0; n < sz / sizeof(*cs); n++)
+ *cs++ = 0x2 << 23;
+
+ end = cs -= 4;
+ *cs++ = 0x5 << 23;
+ if (gen >= 8) {
+ *cs++ = MI_BATCH_BUFFER_START | 1 << 8 | 1;
+ *cs++ = obj.offset;
+ *cs++ = 0;
+ } else if (gen >= 6) {
+ *cs++ = MI_BATCH_BUFFER_START | 1 << 8;
+ *cs++ = obj.offset;
+ } else {
+ *cs++ = MI_BATCH_BUFFER_START | 2 << 6;
+ *cs++ = obj.offset | 1;
+ }
+
+ __for_each_physical_engine(i915, e) {
+ struct pollfd pfd;
+
+ if (!gem_class_has_mutable_submission(i915, e->class))
+ continue;
+
+ execbuf.flags = e->flags | I915_EXEC_FENCE_OUT;
+ gem_execbuf_wr(i915, &execbuf);
+
+ /* Do a dummy wait to enable interrupts on each engine */
+ pfd.fd = execbuf.rsvd2 >> 32;
+ pfd.events = POLLIN;
+ poll(&pfd, 1, 1);
+ close(pfd.fd);
+ }
+
+ read(fd, i_before, sizeof(i_before));
+ sleep(30); /* wait long enough for NMI watchdogs to kick in */
+ read(fd, i_after, sizeof(i_after));
+
+ *end = MI_BATCH_BUFFER_END;
+ __sync_synchronize();
+ munmap(map, sz);
+
+ if (fd != -1) {
+ igt_info("Generated %"PRId64" interrupts (%.2e/s)\n",
+ i_after[0] - i_before[0],
+ (i_after[0] - i_before[0]) * 1e9 / (i_after[1] - i_before[1]));
+ close(fd);
+ }
+
+ gem_sync(i915, obj.handle);
+ gem_close(i915, obj.handle);
+}
igt_main
{
@@ -317,6 +392,9 @@ igt_main
far_fence(i915);
}
+ igt_subtest("many-interrupts")
+ many_interrupts(i915);
+
igt_fixture {
close(i915);
}
--
2.28.0.rc1
More information about the Intel-gfx-trybot
mailing list