[Intel-gfx] [PATCH i-g-t 2/2] tests/perf_pmu: Add tests for engine queued stat

Tvrtko Ursulin tursulin at ursulin.net
Wed Nov 22 12:47:05 UTC 2017


From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>

Simple test to check correct queue-depth is reported per engine.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
---
 tests/perf_pmu.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 79 insertions(+)

diff --git a/tests/perf_pmu.c b/tests/perf_pmu.c
index 8585ed7bcee8..17f0afca6fe1 100644
--- a/tests/perf_pmu.c
+++ b/tests/perf_pmu.c
@@ -87,6 +87,17 @@ static uint64_t pmu_read_single(int fd)
 	return data[0];
 }
 
+static uint64_t pmu_sample_single(int fd, uint64_t *val)
+{
+	uint64_t data[2];
+
+	igt_assert_eq(read(fd, data, sizeof(data)), sizeof(data));
+
+	*val = data[0];
+
+	return data[1];
+}
+
 static void pmu_read_multi(int fd, unsigned int num, uint64_t *val)
 {
 	uint64_t buf[2 + num];
@@ -655,6 +666,65 @@ multi_client(int gem_fd, const struct intel_execution_engine2 *e)
 	assert_within_epsilon(val[1], slept, tolerance);
 }
 
+static double calc_queued(uint64_t d_val, uint64_t d_ns)
+{
+	return (double)d_val * 1e9 * I915_SAMPLE_QUEUED_SCALE / d_ns;
+}
+
+static void
+queued(int gem_fd, const struct intel_execution_engine2 *e)
+{
+	const unsigned long duration_ns = 500e6;
+	igt_spin_t *spin[2];
+	uint64_t val[2];
+	uint64_t ts[2];
+	int fd;
+
+	fd = open_pmu(I915_PMU_ENGINE_QUEUED(e->class, e->instance));
+
+	/*
+	 * First check on an idle engine.
+	 */
+	ts[0] = pmu_sample_single(fd, &val[0]);
+	usleep(duration_ns / 3000);
+	ts[1] = pmu_sample_single(fd, &val[1]);
+	assert_within_epsilon(calc_queued(val[1] - val[0], ts[1] - ts[0]),
+			      0.0, tolerance);
+
+	/*
+	 * First spin batch will be immediately executing.
+	 */
+	spin[0] = igt_spin_batch_new(gem_fd, 0, e2ring(gem_fd, e), 0);
+	igt_spin_batch_set_timeout(spin[0], duration_ns);
+
+	ts[0] = pmu_sample_single(fd, &val[0]);
+	usleep(duration_ns / 3000);
+	ts[1] = pmu_sample_single(fd, &val[1]);
+	assert_within_epsilon(calc_queued(val[1] - val[0], ts[1] - ts[0]),
+			      1.0, tolerance);
+
+	/*
+	 * Second spin batch will sit in the execution queue behind the
+	 * first one so must cause the PMU to correctly report the queued
+	 * counter.
+	 */
+	spin[1] = igt_spin_batch_new(gem_fd, 0, e2ring(gem_fd, e), 0);
+	igt_spin_batch_set_timeout(spin[1], duration_ns);
+
+	ts[0] = pmu_sample_single(fd, &val[0]);
+	usleep(duration_ns / 3000);
+	ts[1] = pmu_sample_single(fd, &val[1]);
+	assert_within_epsilon(calc_queued(val[1] - val[0], ts[1] - ts[0]),
+			      2.0, tolerance);
+
+	gem_sync(gem_fd, spin[0]->handle);
+	gem_sync(gem_fd, spin[1]->handle);
+
+	igt_spin_batch_free(gem_fd, spin[0]);
+	igt_spin_batch_free(gem_fd, spin[1]);
+	close(fd);
+}
+
 /**
  * Tests that i915 PMU corectly errors out in invalid initialization.
  * i915 PMU is uncore PMU, thus:
@@ -1112,6 +1182,9 @@ igt_main
 		igt_subtest_f("init-sema-%s", e->name)
 			init(fd, e, I915_SAMPLE_SEMA);
 
+		igt_subtest_f("init-queued-%s", e->name)
+			init(fd, e, I915_SAMPLE_QUEUED);
+
 		/**
 		 * Test that engines show no load when idle.
 		 */
@@ -1166,6 +1239,12 @@ igt_main
 		 */
 		igt_subtest_f("multi-client-%s", e->name)
 			multi_client(fd, e);
+
+		/**
+		 * Test that queued metric works.
+		 */
+		igt_subtest_f("queued-%s", e->name)
+			queued(fd, e);
 	}
 
 	/**
-- 
2.14.1



More information about the Intel-gfx mailing list