On 13/02/2025 13:12, Philipp Stanner wrote:
On Fri, 2025-02-07 at 14:33 +0000, Tvrtko Ursulin wrote:
Add a basic test for exercising modifying the entities scheduler list
at
runtime.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxxx>
Cc: Christian König <christian.koenig@xxxxxxx>
Cc: Danilo Krummrich <dakr@xxxxxxxxxx>
Cc: Matthew Brost <matthew.brost@xxxxxxxxx>
Cc: Philipp Stanner <phasta@xxxxxxxxxx>
---
.../scheduler/tests/drm_sched_tests_basic.c | 73
++++++++++++++++++-
1 file changed, 72 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/scheduler/tests/drm_sched_tests_basic.c
b/drivers/gpu/drm/scheduler/tests/drm_sched_tests_basic.c
index 9b6bb8b6b98e..af91e4ebd397 100644
--- a/drivers/gpu/drm/scheduler/tests/drm_sched_tests_basic.c
+++ b/drivers/gpu/drm/scheduler/tests/drm_sched_tests_basic.c
@@ -340,6 +340,77 @@ static struct kunit_suite drm_sched_priority = {
.test_cases = drm_sched_priority_tests,
};
+static void drm_sched_test_modify_sched(struct kunit *test)
I'm still confused about the naming convention tbh.
Some things are called drm_mock_*, and this is called drm_sched_test_*
They are two separate things.
We need a scheduler tests cases and a mock GPU so we can test the scheduler.
drm_mock_ implement the mock GPU.
Others are test cases, or kunit test suites, or arrays needed to
implement the suites.
Regards,
Tvrtko
What's the naming system / background?
P.
+{
+ unsigned int i, cur_ent = 0, cur_sched = 0;
+ struct drm_mock_sched_entity *entity[13];
+ struct drm_mock_scheduler *sched[3];
+ struct drm_mock_sched_job *job;
+ const unsigned int qd = 1000;
+ bool done;
+
+ /*
+ * Submit a bunch of jobs against entities configured with
different
+ * schedulers and while waiting for them to complete,
periodically keep
+ * changing schedulers associated with each entity.
+ *
+ * We set up the queue-depth (qd) and job duration so the
sched modify
+ * loop has some time to interact with submissions to the
backend and
+ * job completions as they progress.
+ *
+ * For the number of schedulers and entities we use primes
in order to
+ * perturb the entity->sched assignments with less of a
regular pattern.
+ */
+
+ for (i = 0; i < ARRAY_SIZE(sched); i++)
+ sched[i] = drm_mock_new_scheduler(test,
MAX_SCHEDULE_TIMEOUT);
+
+ for (i = 0; i < ARRAY_SIZE(entity); i++)
+ entity[i] = drm_mock_new_sched_entity(test,
+
DRM_SCHED_PRIORITY_NORMAL,
+ sched[i %
ARRAY_SIZE(sched)]);
+
+ for (i = 0; i < qd; i++) {
+ job = drm_mock_new_sched_job(test,
entity[cur_ent++]);
+ cur_ent %= ARRAY_SIZE(entity);
+ drm_mock_sched_job_set_duration_us(job, 1000);
+ drm_mock_sched_job_submit(job);
+ }
+
+ do {
+ struct drm_gpu_scheduler *modify;
+
+ usleep_range(200, 500);
+ cur_ent++;
+ cur_ent %= ARRAY_SIZE(entity);
+ cur_sched++;
+ cur_sched %= ARRAY_SIZE(sched);
+ modify = &sched[cur_sched]->base;
+ drm_sched_entity_modify_sched(&entity[cur_ent]-
base, &modify,
+ 1);
+ } while (!drm_mock_sched_job_is_finished(job));
+
+ done = drm_mock_sched_job_wait_finished(job, HZ);
+ KUNIT_ASSERT_EQ(test, done, true);
+
+ for (i = 0; i < ARRAY_SIZE(entity); i++)
+ drm_mock_sched_entity_free(entity[i]);
+
+ for (i = 0; i < ARRAY_SIZE(sched); i++)
+ drm_mock_scheduler_fini(sched[i]);
+}
+
+static struct kunit_case drm_sched_modify_sched_tests[] = {
+ KUNIT_CASE(drm_sched_test_modify_sched),
+ {}
+};
+
+static struct kunit_suite drm_sched_modify_sched = {
+ .name = "drm_sched_basic_modify_sched_tests",
+ .test_cases = drm_sched_modify_sched_tests,
+};
+
kunit_test_suites(&drm_sched_basic,
&drm_sched_timeout,
- &drm_sched_priority);
+ &drm_sched_priority,
+ &drm_sched_modify_sched);