summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Brost <matthew.brost@intel.com>2021-10-05 09:47:44 -0700
committerAshutosh Dixit <ashutosh.dixit@intel.com>2021-11-11 08:43:02 -0800
commit5f856084c0f8b2edbfd01e115ab341da7a1b27a6 (patch)
tree60b7c85b77e6755793ebdff4722c4540b0d072f2
parent7201d343fced07a1951feea119480d55bce787e4 (diff)
i915/gem_exec_schedule: Make gem_exec_schedule understand static priority mapping
The i915 currently has 2k visible priority levels which are currently unique. This is changing to statically map these 2k levels into 3 buckets: low: < 0 mid: 0 high: > 0 Update gem_exec_schedule to understand this. This entails updating promotion test to use 3 levels that will map into different buckets and also add bit of delay after releasing a cork beforing completing the spinners to give time to the i915 schedule to process the fence and release and queue the requests. Also skip any tests that rely on having more than 3 priority levels. v2: Add a delay between starting releasing spinner and cork in promotion, add local define for static mapping engine info v3: (Daniele) - Update commit message explaining why delay is needed, unconditionally add delay v4: (Tvrtko) - Reduce sleep period (Daniele) - Add comment in code by sleep Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> Signed-off-by: Matthew Brost <matthew.brost@intel.com>
-rw-r--r--lib/i915/gem_scheduler.c14
-rw-r--r--lib/i915/gem_scheduler.h1
-rw-r--r--lib/i915/i915_drm_local.h10
-rw-r--r--tests/i915/gem_exec_schedule.c45
4 files changed, 55 insertions, 15 deletions
diff --git a/lib/i915/gem_scheduler.c b/lib/i915/gem_scheduler.c
index bec9f0cd..0087df90 100644
--- a/lib/i915/gem_scheduler.c
+++ b/lib/i915/gem_scheduler.c
@@ -28,6 +28,7 @@
#include "igt_core.h"
#include "ioctl_wrappers.h"
+#include "i915/i915_drm_local.h"
#include "i915/gem_scheduler.h"
#include "i915/gem_submission.h"
@@ -91,6 +92,19 @@ bool gem_scheduler_has_ctx_priority(int fd)
}
/**
+ * gem_scheduler_has_static_priority:
+ * @fd: open i915 drm file descriptor
+ *
+ * Feature test macro to query whether the driver supports priority assigned
+ * from user space are statically mapping into 3 buckets.
+ */
+bool gem_scheduler_has_static_priority(int fd)
+{
+ return gem_scheduler_capability(fd) &
+ I915_SCHEDULER_CAP_STATIC_PRIORITY_MAP;
+}
+
+/**
* gem_scheduler_has_preemption:
* @fd: open i915 drm file descriptor
*
diff --git a/lib/i915/gem_scheduler.h b/lib/i915/gem_scheduler.h
index d43e84bd..b00804f7 100644
--- a/lib/i915/gem_scheduler.h
+++ b/lib/i915/gem_scheduler.h
@@ -29,6 +29,7 @@
unsigned gem_scheduler_capability(int fd);
bool gem_scheduler_enabled(int fd);
bool gem_scheduler_has_ctx_priority(int fd);
+bool gem_scheduler_has_static_priority(int fd);
bool gem_scheduler_has_preemption(int fd);
bool gem_scheduler_has_semaphores(int fd);
bool gem_scheduler_has_engine_busy_stats(int fd);
diff --git a/lib/i915/i915_drm_local.h b/lib/i915/i915_drm_local.h
index 74b85c85..b1f6f013 100644
--- a/lib/i915/i915_drm_local.h
+++ b/lib/i915/i915_drm_local.h
@@ -34,6 +34,16 @@ struct drm_i915_gem_create_ext_protected_content {
__u32 flags;
};
+/*
+ * Indicates the 2k user priority levels are statically mapped into 3 buckets as
+ * follows:
+ *
+ * -1k to -1 Low priority
+ * 0 Normal priority
+ * 1 to 1k Highest priority
+ */
+#define I915_SCHEDULER_CAP_STATIC_PRIORITY_MAP (1ul << 5)
+
#if defined(__cplusplus)
}
#endif
diff --git a/tests/i915/gem_exec_schedule.c b/tests/i915/gem_exec_schedule.c
index 9478ed1a..68457406 100644
--- a/tests/i915/gem_exec_schedule.c
+++ b/tests/i915/gem_exec_schedule.c
@@ -248,6 +248,9 @@ static void unplug_show_queue(int fd, struct igt_cork *c,
igt_cork_unplug(c); /* batches will now be queued on the engine */
igt_debugfs_dump(fd, "i915_engine_info");
+ /* give time to the kernel to complete the queueing */
+ usleep(25000);
+
for (int n = 0; n < max; n++) {
uint64_t ahnd = spin[n]->ahnd;
igt_spin_free(fd, spin[n]);
@@ -1469,10 +1472,10 @@ static void promotion(int fd, const intel_ctx_cfg_t *cfg, unsigned ring)
gem_context_set_priority(fd, ctx[LO]->id, MIN_PRIO);
ctx[HI] = intel_ctx_create(fd, cfg);
- gem_context_set_priority(fd, ctx[HI]->id, 0);
+ gem_context_set_priority(fd, ctx[HI]->id, MAX_PRIO);
ctx[NOISE] = intel_ctx_create(fd, cfg);
- gem_context_set_priority(fd, ctx[NOISE]->id, MIN_PRIO/2);
+ gem_context_set_priority(fd, ctx[NOISE]->id, 0);
result = gem_create(fd, 4096);
result_offset = get_offset(ahnd, result, 4096, 0);
@@ -3246,19 +3249,25 @@ igt_main
test_each_engine_store("preempt-other-chain", fd, ctx, e)
preempt_other(fd, &ctx->cfg, e->flags, CHAIN);
- test_each_engine_store("preempt-queue", fd, ctx, e)
- preempt_queue(fd, &ctx->cfg, e->flags, 0);
+ test_each_engine_store("preempt-engines", fd, ctx, e)
+ preempt_engines(fd, e, 0);
- test_each_engine_store("preempt-queue-chain", fd, ctx, e)
- preempt_queue(fd, &ctx->cfg, e->flags, CHAIN);
- test_each_engine_store("preempt-queue-contexts", fd, ctx, e)
- preempt_queue(fd, &ctx->cfg, e->flags, CONTEXTS);
+ igt_subtest_group {
+ igt_fixture {
+ igt_require(!gem_scheduler_has_static_priority(fd));
+ }
- test_each_engine_store("preempt-queue-contexts-chain", fd, ctx, e)
- preempt_queue(fd, &ctx->cfg, e->flags, CONTEXTS | CHAIN);
+ test_each_engine_store("preempt-queue", fd, ctx, e)
+ preempt_queue(fd, &ctx->cfg, e->flags, 0);
- test_each_engine_store("preempt-engines", fd, ctx, e)
- preempt_engines(fd, e, 0);
+ test_each_engine_store("preempt-queue-chain", fd, ctx, e)
+ preempt_queue(fd, &ctx->cfg, e->flags, CHAIN);
+ test_each_engine_store("preempt-queue-contexts", fd, ctx, e)
+ preempt_queue(fd, &ctx->cfg, e->flags, CONTEXTS);
+
+ test_each_engine_store("preempt-queue-contexts-chain", fd, ctx, e)
+ preempt_queue(fd, &ctx->cfg, e->flags, CONTEXTS | CHAIN);
+ }
igt_subtest_group {
igt_hang_t hang;
@@ -3300,11 +3309,17 @@ igt_main
test_each_engine_store("wide", fd, ctx, e)
wide(fd, &ctx->cfg, e->flags);
- test_each_engine_store("reorder-wide", fd, ctx, e)
- reorder_wide(fd, &ctx->cfg, e->flags);
-
test_each_engine_store("smoketest", fd, ctx, e)
smoketest(fd, &ctx->cfg, e->flags, 5);
+
+ igt_subtest_group {
+ igt_fixture {
+ igt_require(!gem_scheduler_has_static_priority(fd));
+ }
+
+ test_each_engine_store("reorder-wide", fd, ctx, e)
+ reorder_wide(fd, &ctx->cfg, e->flags);
+ }
}
igt_subtest_group {