[Intel-gfx] [PATCH igt v3] igt/gem_exec_scheduler: HAS_SCHEDULER no longer means HAS_PREEMPTION

Chris Wilson chris at chris-wilson.co.uk
Wed Sep 27 18:47:52 UTC 2017


Michal wants to limit machines that can do preemption, which means that
we no longer can assume that if we have a scheduler for execbuf, that
implies we have preemption.

v2: Try a capability mask instead
v3: Pretty print the caps.

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 tests/gem_exec_schedule.c | 65 ++++++++++++++++++++++++++++++++++-------------
 1 file changed, 48 insertions(+), 17 deletions(-)

diff --git a/tests/gem_exec_schedule.c b/tests/gem_exec_schedule.c
index 79738ee1..ec0fd9ef 100644
--- a/tests/gem_exec_schedule.c
+++ b/tests/gem_exec_schedule.c
@@ -32,7 +32,12 @@
 #include "igt_rand.h"
 #include "igt_sysfs.h"
 
+#define BIT(x) (1ul << (x))
+
 #define LOCAL_PARAM_HAS_SCHEDULER 41
+#define   HAS_SCHEDULER		BIT(0)
+#define   HAS_PRIORITY		BIT(1)
+#define   HAS_PREEMPTION	BIT(2)
 #define LOCAL_CONTEXT_PARAM_PRIORITY 6
 
 #define LO 0
@@ -870,16 +875,33 @@ static void test_pi_ringfull(int fd, unsigned int engine)
 	munmap(result, 4096);
 }
 
-static bool has_scheduler(int fd)
+static unsigned int has_scheduler(int fd)
 {
 	drm_i915_getparam_t gp;
-	int has = -1;
+	unsigned int caps = 0;
+	char buf[200];
+	size_t len = 0;
 
 	gp.param = LOCAL_PARAM_HAS_SCHEDULER;
-	gp.value = &has;
+	gp.value = (int *)∩︀
 	drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
 
-	return has > 0;
+	if (!caps)
+		return 0;
+
+	len = snprintf(buf, sizeof(buf), "Has kernel scheduler");
+	if (caps & HAS_PRIORITY)
+		len += snprintf(buf + len, sizeof(buf) - len,
+				"%s context priorities",
+				caps & (HAS_PRIORITY - 2) ? "," : " with");
+
+	if (caps & HAS_PREEMPTION)
+		len += snprintf(buf + len, sizeof(buf) - len,
+				"%s batchbuffer preemption",
+				caps & (HAS_PREEMPTION - 2) ? "," : " with");
+
+	igt_info("%s.\n", buf);
+	return caps;
 }
 
 #define HAVE_EXECLISTS 0x1
@@ -920,14 +942,16 @@ out:
 igt_main
 {
 	const struct intel_execution_engine *e;
-	unsigned int caps = 0;
+	unsigned int exec_caps = 0;
+	unsigned int sched_caps = 0;
 	int fd = -1;
 
 	igt_skip_on_simulation();
 
 	igt_fixture {
 		fd = drm_open_driver_master(DRIVER_INTEL);
-		caps = print_welcome(fd);
+		exec_caps = print_welcome(fd);
+		sched_caps = has_scheduler(fd);
 		igt_require_gem(fd);
 		gem_require_mmap_wc(fd);
 		igt_fork_hang_detector(fd);
@@ -949,7 +973,7 @@ igt_main
 
 	igt_subtest_group {
 		igt_fixture {
-			igt_require(has_scheduler(fd));
+			igt_require(sched_caps & HAS_SCHEDULER);
 			ctx_has_priority(fd);
 		}
 
@@ -973,17 +997,23 @@ igt_main
 				igt_subtest_f("promotion-%s", e->name)
 					promotion(fd, e->exec_id | e->flags);
 
-				igt_subtest_f("preempt-%s", e->name)
-					preempt(fd, e->exec_id | e->flags, 0);
+				igt_subtest_group {
+					igt_fixture {
+						igt_require(sched_caps & HAS_PREEMPTION);
+					}
 
-				igt_subtest_f("preempt-contexts-%s", e->name)
-					preempt(fd, e->exec_id | e->flags, NEW_CTX);
+					igt_subtest_f("preempt-%s", e->name)
+						preempt(fd, e->exec_id | e->flags, 0);
 
-				igt_subtest_f("preempt-other-%s", e->name)
-					preempt_other(fd, e->exec_id | e->flags);
+					igt_subtest_f("preempt-contexts-%s", e->name)
+						preempt(fd, e->exec_id | e->flags, NEW_CTX);
 
-				igt_subtest_f("preempt-self-%s", e->name)
-					preempt_self(fd, e->exec_id | e->flags);
+					igt_subtest_f("preempt-other-%s", e->name)
+						preempt_other(fd, e->exec_id | e->flags);
+
+					igt_subtest_f("preempt-self-%s", e->name)
+						preempt_self(fd, e->exec_id | e->flags);
+				}
 
 				igt_subtest_f("deep-%s", e->name)
 					deep(fd, e->exec_id | e->flags);
@@ -999,17 +1029,18 @@ igt_main
 
 	igt_subtest_group {
 		igt_fixture {
-			igt_require(has_scheduler(fd));
+			igt_require(sched_caps & HAS_SCHEDULER);
 			ctx_has_priority(fd);
 
 			/* need separate rings */
-			igt_require(caps & HAVE_EXECLISTS);
+			igt_require(exec_caps & HAVE_EXECLISTS);
 		}
 
 		for (e = intel_execution_engines; e->name; e++) {
 			igt_subtest_group {
 				igt_fixture {
 					gem_require_ring(fd, e->exec_id | e->flags);
+					igt_require(sched_caps & HAS_PREEMPTION);
 				}
 
 				igt_subtest_f("pi-ringfull-%s", e->name)
-- 
2.14.1



More information about the Intel-gfx mailing list