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_* 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);