Skip to content

Commit

Permalink
drm/sched: Add a basic test for modifying entities scheduler list
Browse files Browse the repository at this point in the history
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>
Acked-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Philipp Stanner <phasta@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20250324092633.49746-6-tvrtko.ursulin@igalia.com
  • Loading branch information
Tvrtko Ursulin authored and Philipp Stanner committed Mar 24, 2025
1 parent 7b765cd commit c85fc5d
Showing 1 changed file with 68 additions and 1 deletion.
69 changes: 68 additions & 1 deletion drivers/gpu/drm/scheduler/tests/tests_basic.c
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,73 @@ 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;

/*
* 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_sched_new(test, MAX_SCHEDULE_TIMEOUT);

for (i = 0; i < ARRAY_SIZE(entity); i++)
entity[i] = drm_mock_sched_entity_new(test,
DRM_SCHED_PRIORITY_NORMAL,
sched[i % ARRAY_SIZE(sched)]);

for (i = 0; i < qd; i++) {
job = drm_mock_sched_job_new(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));

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_sched_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);

0 comments on commit c85fc5d

Please sign in to comment.