diff mbox series

[RFC,5/5] drm/scheduler: Add a basic test for modifying entities scheduler list

Message ID 20250207143337.60154-6-tvrtko.ursulin@igalia.com (mailing list archive)
State New, archived
Headers show
Series DRM scheduler kunit tests | expand

Commit Message

Tvrtko Ursulin Feb. 7, 2025, 2:33 p.m. UTC
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(-)

Comments

Philipp Stanner Feb. 13, 2025, 1:12 p.m. UTC | #1
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);
Tvrtko Ursulin Feb. 13, 2025, 1:36 p.m. UTC | #2
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 mbox series

Patch

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