Message ID | 20250207143337.60154-6-tvrtko.ursulin@igalia.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | DRM scheduler kunit tests | expand |
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@igalia.com> > Cc: Christian König <christian.koenig@amd.com> > Cc: Danilo Krummrich <dakr@kernel.org> > Cc: Matthew Brost <matthew.brost@intel.com> > Cc: Philipp Stanner <phasta@kernel.org> > --- > .../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);
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@igalia.com> >> Cc: Christian König <christian.koenig@amd.com> >> Cc: Danilo Krummrich <dakr@kernel.org> >> Cc: Matthew Brost <matthew.brost@intel.com> >> Cc: Philipp Stanner <phasta@kernel.org> >> --- >> .../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); >
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) +{ + 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);
Add a basic test for exercising modifying the entities scheduler list at runtime. Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com> Cc: Christian König <christian.koenig@amd.com> Cc: Danilo Krummrich <dakr@kernel.org> Cc: Matthew Brost <matthew.brost@intel.com> Cc: Philipp Stanner <phasta@kernel.org> --- .../scheduler/tests/drm_sched_tests_basic.c | 73 ++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-)