[PATCH i-g-t] tests/gem_sync: test no inner loop

Marcin Bernatowicz marcin.bernatowicz at linux.intel.com
Wed Aug 12 07:13:22 UTC 2020


Compare sync_ring times when no inner loops are used

Signed-off-by: Marcin Bernatowicz <marcin.bernatowicz at linux.intel.com>
---
 tests/i915/gem_sync.c | 51 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/tests/i915/gem_sync.c b/tests/i915/gem_sync.c
index b317a3927..0ecf4a1be 100644
--- a/tests/i915/gem_sync.c
+++ b/tests/i915/gem_sync.c
@@ -147,6 +147,55 @@ static void xchg_engine(void *array, unsigned i, unsigned j)
 	igt_swap(E[i], E[j]);
 }
 
+static void
+sync_ring_no_inner_loops(int fd, unsigned ring, int num_children, int timeout)
+{
+	struct intel_engine_data ied;
+
+	ied = list_engines(fd, ring);
+	igt_require(ied.nengines);
+
+
+	// if (num_children < ied.nengines)
+	// 	num_children = ied.nengines;
+	igt_info("sync_ring_no_inner_loops\n");
+
+	intel_detect_and_clear_missed_interrupts(fd);
+	igt_fork(child, num_children) {
+		const uint32_t bbe = MI_BATCH_BUFFER_END;
+		struct drm_i915_gem_exec_object2 object;
+		struct drm_i915_gem_execbuffer2 execbuf;
+		double start, elapsed;
+		unsigned long cycles;
+
+		memset(&object, 0, sizeof(object));
+		object.handle = gem_create(fd, 4096);
+		gem_write(fd, object.handle, 0, &bbe, sizeof(bbe));
+
+		memset(&execbuf, 0, sizeof(execbuf));
+		execbuf.buffers_ptr = to_user_pointer(&object);
+		execbuf.buffer_count = 1;
+		execbuf.flags = ied_flags(&ied, child);
+		gem_execbuf(fd, &execbuf);
+		gem_sync(fd, object.handle);
+
+		start = gettime();
+		cycles = 0;
+		do {
+			gem_execbuf(fd, &execbuf);
+			gem_sync(fd, object.handle);
+			++cycles;
+		} while ((elapsed = gettime() - start) < timeout);
+
+		igt_info("%s %ld cycles: %.3f us\n",
+			 ied_name(&ied, child), cycles, elapsed * 1e6 / cycles);
+
+		gem_close(fd, object.handle);
+	}
+	igt_waitchildren_timeout(timeout+10, NULL);
+	igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0);
+}
+
 static void
 sync_ring(int fd, unsigned ring, int num_children, int timeout)
 {
@@ -191,6 +240,8 @@ sync_ring(int fd, unsigned ring, int num_children, int timeout)
 	}
 	igt_waitchildren_timeout(timeout+10, NULL);
 	igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0);
+
+	sync_ring_no_inner_loops(fd, ring, num_children, timeout);
 }
 
 static void
-- 
2.25.1



More information about the Intel-gfx-trybot mailing list