Skip to content

Commit 1472e75

Browse files
committed
drm/sched: Add new test for DRM_GPU_SCHED_STAT_NO_HANG
Add a test to submit a single job against a scheduler with the timeout configured and verify that if the job is still running, the timeout handler will skip the reset and allow the job to complete. Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com> Reviewed-by: Philipp Stanner <phasta@kernel.org> Link: https://lore.kernel.org/r/20250714-sched-skip-reset-v6-4-5c5ba4f55039@igalia.com Signed-off-by: Maíra Canal <mcanal@igalia.com>
1 parent 9b9b5a3 commit 1472e75

3 files changed

Lines changed: 49 additions & 0 deletions

File tree

drivers/gpu/drm/scheduler/tests/mock_scheduler.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,11 @@ mock_sched_timedout_job(struct drm_sched_job *sched_job)
218218
struct drm_mock_sched_job *job = drm_sched_job_to_mock_job(sched_job);
219219
unsigned long flags;
220220

221+
if (job->flags & DRM_MOCK_SCHED_JOB_DONT_RESET) {
222+
job->flags &= ~DRM_MOCK_SCHED_JOB_DONT_RESET;
223+
return DRM_GPU_SCHED_STAT_NO_HANG;
224+
}
225+
221226
spin_lock_irqsave(&sched->lock, flags);
222227
if (!dma_fence_is_signaled_locked(&job->hw_fence)) {
223228
list_del(&job->link);

drivers/gpu/drm/scheduler/tests/sched_tests.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ struct drm_mock_sched_job {
9797

9898
#define DRM_MOCK_SCHED_JOB_DONE 0x1
9999
#define DRM_MOCK_SCHED_JOB_TIMEDOUT 0x2
100+
#define DRM_MOCK_SCHED_JOB_DONT_RESET 0x4
100101
unsigned long flags;
101102

102103
struct list_head link;

drivers/gpu/drm/scheduler/tests/tests_basic.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,8 +287,51 @@ static void drm_sched_basic_timeout(struct kunit *test)
287287
drm_mock_sched_entity_free(entity);
288288
}
289289

290+
static void drm_sched_skip_reset(struct kunit *test)
291+
{
292+
struct drm_mock_scheduler *sched = test->priv;
293+
struct drm_mock_sched_entity *entity;
294+
struct drm_mock_sched_job *job;
295+
unsigned int i;
296+
bool done;
297+
298+
/*
299+
* Submit a single job against a scheduler with the timeout configured
300+
* and verify that if the job is still running, the timeout handler
301+
* will skip the reset and allow the job to complete.
302+
*/
303+
304+
entity = drm_mock_sched_entity_new(test,
305+
DRM_SCHED_PRIORITY_NORMAL,
306+
sched);
307+
job = drm_mock_sched_job_new(test, entity);
308+
309+
job->flags = DRM_MOCK_SCHED_JOB_DONT_RESET;
310+
311+
drm_mock_sched_job_submit(job);
312+
313+
done = drm_mock_sched_job_wait_scheduled(job, HZ);
314+
KUNIT_ASSERT_TRUE(test, done);
315+
316+
done = drm_mock_sched_job_wait_finished(job, 2 * MOCK_TIMEOUT);
317+
KUNIT_ASSERT_FALSE(test, done);
318+
319+
KUNIT_ASSERT_EQ(test,
320+
job->flags & DRM_MOCK_SCHED_JOB_DONT_RESET,
321+
0);
322+
323+
i = drm_mock_sched_advance(sched, 1);
324+
KUNIT_ASSERT_EQ(test, i, 1);
325+
326+
done = drm_mock_sched_job_wait_finished(job, HZ);
327+
KUNIT_ASSERT_TRUE(test, done);
328+
329+
drm_mock_sched_entity_free(entity);
330+
}
331+
290332
static struct kunit_case drm_sched_timeout_tests[] = {
291333
KUNIT_CASE(drm_sched_basic_timeout),
334+
KUNIT_CASE(drm_sched_skip_reset),
292335
{}
293336
};
294337

0 commit comments

Comments
 (0)